Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit fa40416

Browse files
authored
Fix max log level (#7851)
With the switch to tracing we did not set the `max_log_level` anymore. This resulted in a performance degradation as logging did not early exited and thus, `trace` logs were at least resolved every time. This pr fixes it by ensuring that we set the correct max log level.
1 parent 5f3db33 commit fa40416

File tree

1 file changed

+66
-12
lines changed

1 file changed

+66
-12
lines changed

client/cli/src/lib.rs

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,6 @@ pub fn init_logger(
279279
Ok(env_filter)
280280
}
281281

282-
tracing_log::LogTracer::init()
283-
.map_err(|e| format!("Registering Substrate logger failed: {:}!", e))?;
284-
285282
// Initialize filter - ensure to use `parse_default_directive` for any defaults to persist
286283
// after log filter reloading by RPC
287284
let mut env_filter = EnvFilter::default()
@@ -313,22 +310,43 @@ pub fn init_logger(
313310
env_filter = parse_user_directives(env_filter, &pattern)?;
314311
}
315312

313+
let max_level_hint = Layer::<FmtSubscriber>::max_level_hint(&env_filter);
314+
315+
let max_level = if tracing_targets.is_some() {
316+
// If profiling is activated, we require `trace` logging.
317+
log::LevelFilter::Trace
318+
} else {
319+
match max_level_hint {
320+
Some(tracing_subscriber::filter::LevelFilter::INFO) | None => log::LevelFilter::Info,
321+
Some(tracing_subscriber::filter::LevelFilter::TRACE) => log::LevelFilter::Trace,
322+
Some(tracing_subscriber::filter::LevelFilter::WARN) => log::LevelFilter::Warn,
323+
Some(tracing_subscriber::filter::LevelFilter::ERROR) => log::LevelFilter::Error,
324+
Some(tracing_subscriber::filter::LevelFilter::DEBUG) => log::LevelFilter::Debug,
325+
Some(tracing_subscriber::filter::LevelFilter::OFF) => log::LevelFilter::Off,
326+
}
327+
};
328+
329+
tracing_log::LogTracer::builder()
330+
.with_max_level(max_level)
331+
.init()
332+
.map_err(|e| format!("Registering Substrate logger failed: {:}!", e))?;
333+
316334
// If we're only logging `INFO` entries then we'll use a simplified logging format.
317-
let simple = match Layer::<FmtSubscriber>::max_level_hint(&env_filter) {
335+
let simple = match max_level_hint {
318336
Some(level) if level <= tracing_subscriber::filter::LevelFilter::INFO => true,
319337
_ => false,
320338
};
321339

322-
// Always log the special target `sc_tracing`, overrides global level.
323-
// Required because profiling traces are emitted via `sc_tracing`
324-
// NOTE: this must be done after we check the `max_level_hint` otherwise
325-
// it is always raised to `TRACE`.
326-
env_filter = env_filter.add_directive(
327-
parse_default_directive("sc_tracing=trace").expect("provided directive is valid")
328-
);
329-
330340
// Make sure to include profiling targets in the filter
331341
if let Some(tracing_targets) = tracing_targets.clone() {
342+
// Always log the special target `sc_tracing`, overrides global level.
343+
// Required because profiling traces are emitted via `sc_tracing`
344+
// NOTE: this must be done after we check the `max_level_hint` otherwise
345+
// it is always raised to `TRACE`.
346+
env_filter = env_filter.add_directive(
347+
parse_default_directive("sc_tracing=trace").expect("provided directive is valid")
348+
);
349+
332350
env_filter = parse_user_directives(env_filter, &tracing_targets)?;
333351
}
334352

@@ -541,4 +559,40 @@ mod tests {
541559
format!("Expected:\n{}\nGot:\n{}", re, output),
542560
);
543561
}
562+
563+
#[test]
564+
fn log_max_level_is_set_properly() {
565+
fn run_test(rust_log: Option<String>, tracing_targets: Option<String>) -> String {
566+
let executable = env::current_exe().unwrap();
567+
let mut command = Command::new(executable);
568+
569+
command.env("PRINT_MAX_LOG_LEVEL", "1")
570+
.args(&["--nocapture", "log_max_level_is_set_properly"]);
571+
572+
if let Some(rust_log) = rust_log {
573+
command.env("RUST_LOG", rust_log);
574+
}
575+
576+
if let Some(tracing_targets) = tracing_targets {
577+
command.env("TRACING_TARGETS", tracing_targets);
578+
}
579+
580+
let output = command.output().unwrap();
581+
582+
String::from_utf8(output.stderr).unwrap()
583+
}
584+
585+
if env::var("PRINT_MAX_LOG_LEVEL").is_ok() {
586+
init_logger(InitLoggerParams {
587+
tracing_targets: env::var("TRACING_TARGETS").ok(),
588+
..Default::default()
589+
}).unwrap();
590+
eprint!("MAX_LOG_LEVEL={:?}", log::max_level());
591+
} else {
592+
assert_eq!("MAX_LOG_LEVEL=Info", run_test(None, None));
593+
assert_eq!("MAX_LOG_LEVEL=Trace", run_test(Some("test=trace".into()), None));
594+
assert_eq!("MAX_LOG_LEVEL=Debug", run_test(Some("test=debug".into()), None));
595+
assert_eq!("MAX_LOG_LEVEL=Trace", run_test(None, Some("test=info".into())));
596+
}
597+
}
544598
}

0 commit comments

Comments
 (0)