5858///
5959/// let my_logger = MyLogger {};
6060/// log!(
61- /// logger: & my_logger,
61+ /// logger: my_logger,
6262/// Level::Error,
6363/// "Received errors: {}, {}",
6464/// data.0, data.1
6565/// );
66+ /// ```
67+ ///
68+ /// The `logger` argument accepts a value that implements the `Log` trait. The value
69+ /// will be borrowed within the macro.
70+ ///
71+ /// Note that the global level set via Cargo features, or through `set_max_level` will
72+ /// still apply, even when a custom logger is supplied with the `logger` argument.
6673#[ macro_export]
6774#[ clippy:: format_args]
6875macro_rules! log {
76+ // log!(logger: my_logger, target: "my_target", Level::Info, "a {} event", "log");
77+ ( logger: $logger: expr, target: $target: expr, $lvl: expr, $( $arg: tt) +) => ( {
78+ $crate:: __log!(
79+ logger: $crate:: __log_logger!( $logger) ,
80+ target: $target,
81+ $lvl,
82+ $( $arg) +
83+ )
84+ } ) ;
85+
86+ // log!(logger: my_logger, Level::Info, "a log event")
87+ ( logger: $logger: expr, $lvl: expr, $( $arg: tt) +) => ( {
88+ $crate:: __log!(
89+ logger: $crate:: __log_logger!( $logger) ,
90+ target: $crate:: __private_api:: module_path!( ) ,
91+ $lvl,
92+ $( $arg) +
93+ )
94+ } ) ;
95+
96+ // log!(target: "my_target", Level::Info, "a log event")
97+ ( target: $target: expr, $lvl: expr, $( $arg: tt) +) => ( {
98+ $crate:: __log!(
99+ logger: $crate:: __log_logger!( __log_global_logger) ,
100+ target: $target,
101+ $lvl,
102+ $( $arg) +
103+ )
104+ } ) ;
105+
106+ // log!(Level::Info, "a log event")
107+ ( $lvl: expr, $( $arg: tt) +) => ( {
108+ $crate:: __log!(
109+ logger: $crate:: __log_logger!( __log_global_logger) ,
110+ target: $crate:: __private_api:: module_path!( ) ,
111+ $lvl,
112+ $( $arg) +
113+ )
114+ } ) ;
115+ }
116+
117+ #[ doc( hidden) ]
118+ #[ macro_export]
119+ macro_rules! __log {
69120 // log!(logger: my_logger, target: "my_target", Level::Info, key1:? = 42, key2 = true; "a {} event", "log");
70121 ( logger: $logger: expr, target: $target: expr, $lvl: expr, $( $key: tt $( : $capture: tt) ? $( = $value: expr) ?) ,+; $( $arg: tt) +) => ( {
71122 let lvl = $lvl;
72123 if lvl <= $crate:: STATIC_MAX_LEVEL && lvl <= $crate:: max_level( ) {
73- $crate:: __private_api:: log:: < & _ , _> (
74- & ( $logger) ,
124+ $crate:: __private_api:: log(
125+ $logger,
75126 $crate:: __private_api:: format_args!( $( $arg) +) ,
76127 lvl,
77128 & ( $target, $crate:: __private_api:: module_path!( ) , $crate:: __private_api:: loc( ) ) ,
78- & [ $( ( $crate:: __log_key!( $key) , $crate:: __log_value!( $key $( : $capture) * = $( $value) * ) ) ) ,+]
129+ & [ $( ( $crate:: __log_key!( $key) , $crate:: __log_value!( $key $( : $capture) * = $( $value) * ) ) ) ,+] as & [ _ ] ,
79130 ) ;
80131 }
81132 } ) ;
@@ -85,29 +136,14 @@ macro_rules! log {
85136 let lvl = $lvl;
86137 if lvl <= $crate:: STATIC_MAX_LEVEL && lvl <= $crate:: max_level( ) {
87138 $crate:: __private_api:: log(
88- & ( $logger) ,
139+ $logger,
89140 $crate:: __private_api:: format_args!( $( $arg) +) ,
90141 lvl,
91142 & ( $target, $crate:: __private_api:: module_path!( ) , $crate:: __private_api:: loc( ) ) ,
92143 ( ) ,
93144 ) ;
94145 }
95146 } ) ;
96-
97- // log!(logger: my_logger, Level::Info, "a log event")
98- ( logger: $logger: expr, $lvl: expr, $( $arg: tt) +) => ( {
99- $crate:: log!( logger: $logger, target: $crate:: __private_api:: module_path!( ) , $lvl, $( $arg) +)
100- } ) ;
101-
102- // log!(target: "my_target", Level::Info, "a log event")
103- ( target: $target: expr, $lvl: expr, $( $arg: tt) +) => ( {
104- $crate:: log!( logger: $crate:: __private_api:: GlobalLogger , target: $target, $lvl, $( $arg) +)
105- } ) ;
106-
107- // log!(Level::Info, "a log event")
108- ( $lvl: expr, $( $arg: tt) +) => ( {
109- $crate:: log!( target: $crate:: __private_api:: module_path!( ) , $lvl, $( $arg) +)
110- } ) ;
111147}
112148
113149/// Logs a message at the error level.
@@ -130,13 +166,13 @@ macro_rules! error {
130166 // error!(logger: my_logger, target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
131167 // error!(logger: my_logger, target: "my_target", "a {} event", "log")
132168 ( logger: $logger: expr, target: $target: expr, $( $arg: tt) +) => ( {
133- $crate:: log!( logger: $logger, target: $target, $crate:: Level :: Error , $( $arg) +)
169+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , target: $target, $crate:: Level :: Error , $( $arg) +)
134170 } ) ;
135171
136172 // error!(logger: my_logger, key1 = 42, key2 = true; "a {} event", "log")
137173 // error!(logger: my_logger, "a {} event", "log")
138174 ( logger: $logger: expr, $( $arg: tt) +) => ( {
139- $crate:: log!( logger: $logger, $crate:: Level :: Error , $( $arg) +)
175+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , $crate:: Level :: Error , $( $arg) +)
140176 } ) ;
141177
142178 // error!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
@@ -169,13 +205,13 @@ macro_rules! warn {
169205 // warn!(logger: my_logger, target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
170206 // warn!(logger: my_logger, target: "my_target", "a {} event", "log")
171207 ( logger: $logger: expr, target: $target: expr, $( $arg: tt) +) => ( {
172- $crate:: log!( logger: $logger, target: $target, $crate:: Level :: Warn , $( $arg) +)
208+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , target: $target, $crate:: Level :: Warn , $( $arg) +)
173209 } ) ;
174210
175211 // warn!(logger: my_logger, key1 = 42, key2 = true; "a {} event", "log")
176212 // warn!(logger: my_logger, "a {} event", "log")
177213 ( logger: $logger: expr, $( $arg: tt) +) => ( {
178- $crate:: log!( logger: $logger, $crate:: Level :: Warn , $( $arg) +)
214+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , $crate:: Level :: Warn , $( $arg) +)
179215 } ) ;
180216
181217 // warn!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
@@ -217,13 +253,13 @@ macro_rules! info {
217253 // info!(logger: my_logger, target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
218254 // info!(logger: my_logger, target: "my_target", "a {} event", "log")
219255 ( logger: $logger: expr, target: $target: expr, $( $arg: tt) +) => ( {
220- $crate:: log!( logger: $logger, target: $target, $crate:: Level :: Info , $( $arg) +)
256+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , target: $target, $crate:: Level :: Info , $( $arg) +)
221257 } ) ;
222258
223259 // info!(logger: my_logger, key1 = 42, key2 = true; "a {} event", "log")
224260 // info!(logger: my_logger, "a {} event", "log")
225261 ( logger: $logger: expr, $( $arg: tt) +) => ( {
226- $crate:: log!( logger: $logger, $crate:: Level :: Info , $( $arg) +)
262+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , $crate:: Level :: Info , $( $arg) +)
227263 } ) ;
228264
229265 // info!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
@@ -257,13 +293,13 @@ macro_rules! debug {
257293 // debug!(logger: my_logger, target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
258294 // debug!(logger: my_logger, target: "my_target", "a {} event", "log")
259295 ( logger: $logger: expr, target: $target: expr, $( $arg: tt) +) => ( {
260- $crate:: log!( logger: $logger, target: $target, $crate:: Level :: Debug , $( $arg) +)
296+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , target: $target, $crate:: Level :: Debug , $( $arg) +)
261297 } ) ;
262298
263299 // debug!(logger: my_logger, key1 = 42, key2 = true; "a {} event", "log")
264300 // debug!(logger: my_logger, "a {} event", "log")
265301 ( logger: $logger: expr, $( $arg: tt) +) => ( {
266- $crate:: log!( logger: $logger, $crate:: Level :: Debug , $( $arg) +)
302+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , $crate:: Level :: Debug , $( $arg) +)
267303 } ) ;
268304
269305 // debug!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
@@ -301,13 +337,13 @@ macro_rules! trace {
301337 // trace!(logger: my_logger, target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
302338 // trace!(logger: my_logger, target: "my_target", "a {} event", "log")
303339 ( logger: $logger: expr, target: $target: expr, $( $arg: tt) +) => ( {
304- $crate:: log!( logger: $logger, target: $target, $crate:: Level :: Trace , $( $arg) +)
340+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , target: $target, $crate:: Level :: Trace , $( $arg) +)
305341 } ) ;
306342
307343 // trace!(logger: my_logger, key1 = 42, key2 = true; "a {} event", "log")
308344 // trace!(logger: my_logger, "a {} event", "log")
309345 ( logger: $logger: expr, $( $arg: tt) +) => ( {
310- $crate:: log!( logger: $logger, $crate:: Level :: Trace , $( $arg) +)
346+ $crate:: log!( logger: $crate :: __log_logger! ( $ logger) , $crate:: Level :: Trace , $( $arg) +)
311347 } ) ;
312348
313349 // trace!(target: "my_target", key1 = 42, key2 = true; "a {} event", "log")
@@ -349,28 +385,57 @@ macro_rules! trace {
349385/// debug!(target: "Global", "expensive debug data: {} {}", data.x, data.y);
350386/// }
351387/// ```
388+ ///
389+ /// This macro accepts the same `target` and `logger` arguments as [`macro@log`].
352390#[ macro_export]
353391macro_rules! log_enabled {
392+ // log_enabled!(logger: my_logger, target: "my_target", Level::Info)
354393 ( logger: $logger: expr, target: $target: expr, $lvl: expr) => ( {
355- let lvl = $lvl;
356- lvl <= $crate:: STATIC_MAX_LEVEL
357- && lvl <= $crate:: max_level( )
358- && $crate:: __private_api:: enabled( $logger, lvl, $target)
394+ $crate:: __log_enabled!( logger: $crate:: __log_logger!( $logger) , target: $target, $lvl)
359395 } ) ;
360396
397+ // log_enabled!(logger: my_logger, Level::Info)
361398 ( logger: $logger: expr, $lvl: expr) => ( {
362- $crate:: log_enabled !( logger: $logger, target: $crate:: __private_api:: module_path!( ) , $lvl)
399+ $crate:: __log_enabled !( logger: $crate :: __log_logger! ( $ logger) , target: $crate:: __private_api:: module_path!( ) , $lvl)
363400 } ) ;
364401
402+ // log_enabled!(target: "my_target", Level::Info)
365403 ( target: $target: expr, $lvl: expr) => ( {
366- $crate:: log_enabled !( logger: $crate:: __private_api :: GlobalLogger , target: $target, $lvl)
404+ $crate:: __log_enabled !( logger: $crate:: __log_logger! ( __log_global_logger ) , target: $target, $lvl)
367405 } ) ;
368406
407+ // log_enabled!(Level::Info)
369408 ( $lvl: expr) => ( {
370- $crate:: log_enabled! ( target: $crate:: __private_api:: module_path!( ) , $lvl)
409+ $crate:: __log_enabled! ( logger : $crate :: __log_logger! ( __log_global_logger ) , target: $crate:: __private_api:: module_path!( ) , $lvl)
371410 } ) ;
372411}
373412
413+ #[ doc( hidden) ]
414+ #[ macro_export]
415+ macro_rules! __log_enabled {
416+ // log_enabled!(logger: my_logger, target: "my_target", Level::Info)
417+ ( logger: $logger: expr, target: $target: expr, $lvl: expr) => { {
418+ let lvl = $lvl;
419+ lvl <= $crate:: STATIC_MAX_LEVEL
420+ && lvl <= $crate:: max_level( )
421+ && $crate:: __private_api:: enabled( $logger, lvl, $target)
422+ } } ;
423+ }
424+
425+ // Determine the logger to use, and whether to take it by-value or by reference
426+
427+ #[ doc( hidden) ]
428+ #[ macro_export]
429+ macro_rules! __log_logger {
430+ ( __log_global_logger) => { {
431+ $crate:: __private_api:: GlobalLogger
432+ } } ;
433+
434+ ( $logger: expr) => { {
435+ & ( $logger)
436+ } } ;
437+ }
438+
374439// These macros use a pattern of #[cfg]s to produce nicer error
375440// messages when log features aren't available
376441
0 commit comments