Skip to content

Commit ea6f54d

Browse files
authored
Merge pull request #673 from rust-lang/feat/logger-by-ref
Pass global logger by value, supplied logger by ref
2 parents a438c6e + d229c73 commit ea6f54d

File tree

4 files changed

+206
-60
lines changed

4 files changed

+206
-60
lines changed

src/__private_api.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,7 @@ impl<'a> KVs<'a> for () {
3535
// Log implementation.
3636

3737
/// The global logger proxy.
38-
///
39-
/// This zero-sized type implements the [`Log`] trait by forwarding calls
40-
/// to the logger registered with the `set_boxed_logger` or `set_logger`
41-
/// methods if there is one, or a nop logger as default.
42-
#[derive(Copy, Clone, Default, Debug)]
38+
#[derive(Debug)]
4339
pub struct GlobalLogger;
4440

4541
impl Log for GlobalLogger {
@@ -56,6 +52,7 @@ impl Log for GlobalLogger {
5652
}
5753
}
5854

55+
// Split from `log` to reduce generics and code size
5956
fn log_impl<L: Log>(
6057
logger: L,
6158
args: Arguments,
@@ -85,7 +82,7 @@ fn log_impl<L: Log>(
8582
}
8683

8784
pub fn log<'a, K, L>(
88-
logger: &L,
85+
logger: L,
8986
args: Arguments,
9087
level: Level,
9188
target_module_path_and_loc: &(&str, &'static str, &'static Location),

src/macros.rs

+102-37
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,75 @@
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]
6875
macro_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]
353391
macro_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

tests/integration.rs

-8
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,6 @@
33
use log::{debug, error, info, trace, warn, Level, LevelFilter, Log, Metadata, Record};
44
use std::sync::{Arc, Mutex};
55

6-
#[cfg(feature = "std")]
7-
use log::set_boxed_logger;
8-
9-
#[cfg(not(feature = "std"))]
10-
fn set_boxed_logger(logger: Box<dyn Log>) -> Result<(), log::SetLoggerError> {
11-
log::set_logger(Box::leak(logger))
12-
}
13-
146
struct State {
157
last_log_level: Mutex<Option<Level>>,
168
last_log_location: Mutex<Option<u32>>,

0 commit comments

Comments
 (0)