Skip to content

Commit 6f08af0

Browse files
hawkwhds
authored andcommitted
subscriber: set log max level when reloading (#1270)
This modifies the `tracing_subscriber::reload` layer to also set the `log` crate's max level with the current max `tracing` level filter after reloading. If reloading the subscriber caused the max `tracing` level to change, this ensures that the change is propagated to the `log` crate as well. In the case where the max level was made more verbose, this will ensure that `log` records which were previously disabled are enabled correctly; in the case where it was made less verbose, this improve performance by not having to perfrom more costly filtering for those `log` records. The `log` max level is set only after rebuilding the callsite interest cache, which is what sets the max `tracing` level filter. This ensures that we pass the latest state to the `log` crate. Signed-off-by: Eliza Weisman <[email protected]>
1 parent f6a6c8c commit 6f08af0

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

tracing-subscriber/src/reload.rs

+10
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,16 @@ impl<L, S> Handle<L, S> {
317317
drop(lock);
318318

319319
callsite::rebuild_interest_cache();
320+
321+
// If the `log` crate compatibility feature is in use, set `log`'s max
322+
// level as well, in case the max `tracing` level changed. We do this
323+
// *after* rebuilding the interest cache, as that's when the `tracing`
324+
// max level filter is re-computed.
325+
#[cfg(feature = "tracing-log")]
326+
tracing_log::log::set_max_level(tracing_log::AsLog::as_log(
327+
&crate::filter::LevelFilter::current(),
328+
));
329+
320330
Ok(())
321331
}
322332

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#![cfg(all(feature = "env-filter", feature = "tracing-log"))]
2+
3+
use tracing::{self, Level};
4+
use tracing_mock::{expect, subscriber};
5+
use tracing_subscriber::{filter::LevelFilter, prelude::*, reload};
6+
7+
#[test]
8+
fn reload_max_log_level() {
9+
let (subscriber, finished) = subscriber::mock()
10+
.event(expect::event().at_level(Level::INFO))
11+
.event(expect::event().at_level(Level::DEBUG))
12+
.event(expect::event().at_level(Level::INFO))
13+
.only()
14+
.run_with_handle();
15+
let (filter, reload_handle) = reload::Layer::new(LevelFilter::INFO);
16+
subscriber.with(filter).init();
17+
18+
assert!(log::log_enabled!(log::Level::Info));
19+
assert!(!log::log_enabled!(log::Level::Debug));
20+
assert!(!log::log_enabled!(log::Level::Trace));
21+
22+
log::debug!("i'm disabled");
23+
log::info!("i'm enabled");
24+
25+
reload_handle
26+
.reload(Level::DEBUG)
27+
.expect("reloading succeeds");
28+
29+
assert!(log::log_enabled!(log::Level::Info));
30+
assert!(log::log_enabled!(log::Level::Debug));
31+
assert!(!log::log_enabled!(log::Level::Trace));
32+
33+
log::debug!("i'm enabled now");
34+
log::info!("i'm still enabled, too");
35+
36+
finished.assert_finished();
37+
}

0 commit comments

Comments
 (0)