1#[doc(hidden)]
6pub mod __private {
7 use core::fmt;
8
9 use crate::logger::Logger;
10 use crate::record::{Field, Metadata};
11
12 #[inline]
14 #[must_use]
15 pub fn global() -> Option<&'static Logger> {
16 crate::global::get()
17 }
18
19 #[inline]
22 pub fn emit_args(
23 logger: &Logger,
24 metadata: Metadata<'_>,
25 args: fmt::Arguments<'_>,
26 fields: &[Field<'_>],
27 ) {
28 logger.emit_fmt(metadata, args, fields, &[]);
29 }
30
31 #[inline]
34 pub fn emit_str(logger: &Logger, metadata: Metadata<'_>, message: &str, fields: &[Field<'_>]) {
35 let _reported = logger.emit_unchecked(metadata, message, fields, &[]);
37 }
38}
39
40#[cfg_attr(all(feature = "logfmt"), doc = "```")]
90#[cfg_attr(not(all(feature = "logfmt")), doc = "```ignore")]
91#[macro_export]
102macro_rules! log_at {
103 ($level:expr, target: $target:expr, $msg:literal $($rest:tt)*) => {
105 $crate::__log_io_event!(@munch ((global) ($level) ($target) (lit $msg)) [] [] $($rest)*)
106 };
107 ($level:expr, $msg:literal $($rest:tt)*) => {
109 $crate::__log_io_event!(
110 @munch ((global) ($level) (::core::module_path!()) (lit $msg)) [] [] $($rest)*
111 )
112 };
113 ($logger:expr, $level:expr, target: $target:expr, $($rest:tt)+) => {
115 $crate::__log_io_event!(@msg (logger $logger) ($level) ($target) $($rest)+)
116 };
117 ($logger:expr, $level:expr, $($rest:tt)+) => {
119 $crate::__log_io_event!(@msg (logger $logger) ($level) (::core::module_path!()) $($rest)+)
120 };
121}
122
123#[cfg_attr(all(feature = "json"), doc = "```")]
128#[cfg_attr(not(all(feature = "json")), doc = "```ignore")]
129#[macro_export]
133macro_rules! trace {
134 ($($args:tt)+) => { $crate::__log_io_level!($crate::Level::Trace; $($args)+) };
135}
136
137#[cfg_attr(all(feature = "json"), doc = "```")]
142#[cfg_attr(not(all(feature = "json")), doc = "```ignore")]
143#[macro_export]
147macro_rules! debug {
148 ($($args:tt)+) => { $crate::__log_io_level!($crate::Level::Debug; $($args)+) };
149}
150
151#[cfg_attr(all(feature = "json"), doc = "```")]
156#[cfg_attr(not(all(feature = "json")), doc = "```ignore")]
157#[macro_export]
164macro_rules! info {
165 ($($args:tt)+) => { $crate::__log_io_level!($crate::Level::Info; $($args)+) };
166}
167
168#[cfg_attr(all(feature = "json"), doc = "```")]
173#[cfg_attr(not(all(feature = "json")), doc = "```ignore")]
174#[macro_export]
178macro_rules! warn {
179 ($($args:tt)+) => { $crate::__log_io_level!($crate::Level::Warn; $($args)+) };
180}
181
182#[cfg_attr(all(feature = "json"), doc = "```")]
190#[cfg_attr(not(all(feature = "json")), doc = "```ignore")]
191#[macro_export]
196macro_rules! error {
197 ($($args:tt)+) => { $crate::__log_io_level!($crate::Level::Error; $($args)+) };
198}
199
200#[doc(hidden)]
201#[macro_export]
202macro_rules! __log_io_level {
203 ($level:expr; target: $target:expr, $msg:literal $($rest:tt)*) => {
205 $crate::__log_io_event!(@munch ((global) ($level) ($target) (lit $msg)) [] [] $($rest)*)
206 };
207 ($level:expr; $msg:literal $($rest:tt)*) => {
208 $crate::__log_io_event!(
209 @munch ((global) ($level) (::core::module_path!()) (lit $msg)) [] [] $($rest)*
210 )
211 };
212 ($level:expr; $logger:expr, target: $target:expr, $($rest:tt)+) => {
214 $crate::__log_io_event!(@msg (logger $logger) ($level) ($target) $($rest)+)
215 };
216 ($level:expr; $logger:expr, $($rest:tt)+) => {
217 $crate::__log_io_event!(@msg (logger $logger) ($level) (::core::module_path!()) $($rest)+)
218 };
219}
220
221#[doc(hidden)]
222#[macro_export]
223macro_rules! __log_io_event {
224 (@msg $lg:tt $level:tt $target:tt $msg:literal $($rest:tt)*) => {
226 $crate::__log_io_event!(@munch ($lg $level $target (lit $msg)) [] [] $($rest)*)
227 };
228 (@msg $lg:tt $level:tt $target:tt $msg:expr $(, $($rest:tt)*)?) => {
229 $crate::__log_io_event!(@munch ($lg $level $target (expr $msg)) [] [] $(, $($rest)*)?)
230 };
231
232 (@munch $ctx:tt [$($a:tt)*] [$($f:tt)*] $(,)?) => {
235 $crate::__log_io_event!(@emit $ctx [$($a)*] [$($f)*])
236 };
237 (@munch $ctx:tt [$($a:tt)*] [$($f:tt)*] , $k:literal = % $v:expr $(, $($rest:tt)*)?) => {
239 $crate::__log_io_event!(@munch $ctx [$($a)*]
240 [$($f)* ($crate::Field::new($k, $crate::Value::Display(&$v)))] $(, $($rest)*)?)
241 };
242 (@munch $ctx:tt [$($a:tt)*] [$($f:tt)*] , $k:literal = ? $v:expr $(, $($rest:tt)*)?) => {
243 $crate::__log_io_event!(@munch $ctx [$($a)*]
244 [$($f)* ($crate::Field::new($k, $crate::Value::Debug(&$v)))] $(, $($rest)*)?)
245 };
246 (@munch $ctx:tt [$($a:tt)*] [$($f:tt)*] , $k:literal = $v:expr $(, $($rest:tt)*)?) => {
247 $crate::__log_io_event!(@munch $ctx [$($a)*]
248 [$($f)* ($crate::Field::new($k, $crate::Value::from($v)))] $(, $($rest)*)?)
249 };
250 (@munch $ctx:tt [$($a:tt)*] [$($f:tt)*]
252 , $k0:ident $(. $kn:ident)* = % $v:expr $(, $($rest:tt)*)?) => {
253 $crate::__log_io_event!(@munch $ctx [$($a)*]
254 [$($f)* ($crate::Field::new(
255 ::core::concat!(::core::stringify!($k0) $(, ".", ::core::stringify!($kn))*),
256 $crate::Value::Display(&$v),
257 ))] $(, $($rest)*)?)
258 };
259 (@munch $ctx:tt [$($a:tt)*] [$($f:tt)*]
260 , $k0:ident $(. $kn:ident)* = ? $v:expr $(, $($rest:tt)*)?) => {
261 $crate::__log_io_event!(@munch $ctx [$($a)*]
262 [$($f)* ($crate::Field::new(
263 ::core::concat!(::core::stringify!($k0) $(, ".", ::core::stringify!($kn))*),
264 $crate::Value::Debug(&$v),
265 ))] $(, $($rest)*)?)
266 };
267 (@munch $ctx:tt [$($a:tt)*] [$($f:tt)*]
268 , $k0:ident $(. $kn:ident)* = $v:expr $(, $($rest:tt)*)?) => {
269 $crate::__log_io_event!(@munch $ctx [$($a)*]
270 [$($f)* ($crate::Field::new(
271 ::core::concat!(::core::stringify!($k0) $(, ".", ::core::stringify!($kn))*),
272 $crate::Value::from($v),
273 ))] $(, $($rest)*)?)
274 };
275 (@munch $ctx:tt [$($a:tt)*] [$($f:tt)*] , $arg:expr $(, $($rest:tt)*)?) => {
277 $crate::__log_io_event!(@munch $ctx [$($a)* ($arg)] [$($f)*] $(, $($rest)*)?)
278 };
279
280 (@emit ((global) $level:tt $target:tt $msg:tt) $args:tt $fields:tt) => {
282 if let ::core::option::Option::Some(__log_io_logger) = $crate::__private::global() {
283 $crate::__log_io_event!(@body __log_io_logger $level $target $msg $args $fields)
284 }
285 };
286 (@emit ((logger $logger:expr) $level:tt $target:tt $msg:tt) $args:tt $fields:tt) => {{
287 let __log_io_logger: &$crate::Logger = &$logger;
288 $crate::__log_io_event!(@body __log_io_logger $level $target $msg $args $fields)
289 }};
290 (@body $lg:ident ($level:expr) ($target:expr) (lit $msg:literal) [$($a:tt)*] [$($f:tt)*]) => {{
291 let __log_io_level: $crate::Level = $level;
292 let __log_io_target: &str = $target;
293 if $lg.enabled(__log_io_target, __log_io_level) {
294 $crate::__private::emit_args(
295 $lg,
296 $crate::Metadata::new(__log_io_level, __log_io_target)
297 .with_location(::core::file!(), ::core::line!()),
298 ::core::format_args!($msg $(, $a)*),
299 &[$($f),*],
300 );
301 }
302 }};
303 (@body $lg:ident ($level:expr) ($target:expr) (expr $msg:expr) [] [$($f:tt)*]) => {{
304 let __log_io_level: $crate::Level = $level;
305 let __log_io_target: &str = $target;
306 if $lg.enabled(__log_io_target, __log_io_level) {
307 $crate::__private::emit_str(
308 $lg,
309 $crate::Metadata::new(__log_io_level, __log_io_target)
310 .with_location(::core::file!(), ::core::line!()),
311 $msg,
312 &[$($f),*],
313 );
314 }
315 }};
316}