@@ -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 {}\n Got:\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