@@ -27,7 +27,6 @@ pub mod arg_enums;
2727mod commands;
2828mod config;
2929mod error;
30- mod logging;
3130mod params;
3231mod runner;
3332
@@ -48,8 +47,13 @@ use structopt::{
4847 StructOpt ,
4948} ;
5049use tracing_subscriber:: {
51- filter:: Directive , fmt:: time:: ChronoLocal , layer:: SubscriberExt , FmtSubscriber , Layer ,
50+ fmt:: time:: ChronoLocal ,
51+ EnvFilter ,
52+ FmtSubscriber ,
53+ Layer ,
54+ layer:: SubscriberExt ,
5255} ;
56+ pub use sc_tracing:: logging;
5357
5458pub use logging:: PREFIX_LOG_SPAN ;
5559#[ doc( hidden) ]
@@ -243,12 +247,16 @@ pub fn init_logger(
243247 pattern : & str ,
244248 tracing_receiver : sc_tracing:: TracingReceiver ,
245249 profiling_targets : Option < String > ,
250+ disable_log_reloading : bool ,
246251) -> std:: result:: Result < ( ) , String > {
247- fn parse_directives ( dirs : impl AsRef < str > ) -> Vec < Directive > {
248- dirs. as_ref ( )
249- . split ( ',' )
250- . filter_map ( |s| s. parse ( ) . ok ( ) )
251- . collect ( )
252+ use sc_tracing:: parse_default_directive;
253+
254+ // Accept all valid directives and print invalid ones
255+ fn parse_user_directives ( mut env_filter : EnvFilter , dirs : & str ) -> std:: result:: Result < EnvFilter , String > {
256+ for dir in dirs. split ( ',' ) {
257+ env_filter = env_filter. add_directive ( parse_default_directive ( & dir) ?) ;
258+ }
259+ Ok ( env_filter)
252260 }
253261
254262 if let Err ( e) = tracing_log:: LogTracer :: init ( ) {
@@ -257,33 +265,35 @@ pub fn init_logger(
257265 ) )
258266 }
259267
260- let mut env_filter = tracing_subscriber:: EnvFilter :: default ( )
268+ // Initialize filter - ensure to use `parse_default_directive` for any defaults to persist
269+ // after log filter reloading by RPC
270+ let mut env_filter = EnvFilter :: default ( )
271+ // Enable info
272+ . add_directive ( parse_default_directive ( "info" )
273+ . expect ( "provided directive is valid" ) )
261274 // Disable info logging by default for some modules.
262- . add_directive ( "ws=off" . parse ( ) . expect ( "provided directive is valid" ) )
263- . add_directive ( "yamux=off" . parse ( ) . expect ( "provided directive is valid" ) )
264- . add_directive ( "cranelift_codegen=off" . parse ( ) . expect ( "provided directive is valid" ) )
275+ . add_directive ( parse_default_directive ( "ws=off" )
276+ . expect ( "provided directive is valid" ) )
277+ . add_directive ( parse_default_directive ( "yamux=off" )
278+ . expect ( "provided directive is valid" ) )
279+ . add_directive ( parse_default_directive ( "cranelift_codegen=off" )
280+ . expect ( "provided directive is valid" ) )
265281 // Set warn logging by default for some modules.
266- . add_directive ( "cranelift_wasm=warn" . parse ( ) . expect ( "provided directive is valid" ) )
267- . add_directive ( "hyper=warn" . parse ( ) . expect ( "provided directive is valid" ) )
268- // Enable info for others.
269- . add_directive ( tracing_subscriber :: filter :: LevelFilter :: INFO . into ( ) ) ;
282+ . add_directive ( parse_default_directive ( "cranelift_wasm=warn" )
283+ . expect ( "provided directive is valid" ) )
284+ . add_directive ( parse_default_directive ( "hyper=warn" )
285+ . expect ( "provided directive is valid" ) ) ;
270286
271287 if let Ok ( lvl) = std:: env:: var ( "RUST_LOG" ) {
272288 if lvl != "" {
273- // We're not sure if log or tracing is available at this moment, so silently ignore the
274- // parse error.
275- for directive in parse_directives ( lvl) {
276- env_filter = env_filter. add_directive ( directive) ;
277- }
289+ env_filter = parse_user_directives ( env_filter, & lvl) ?;
278290 }
279291 }
280292
281293 if pattern != "" {
282294 // We're not sure if log or tracing is available at this moment, so silently ignore the
283295 // parse error.
284- for directive in parse_directives ( pattern) {
285- env_filter = env_filter. add_directive ( directive) ;
286- }
296+ env_filter = parse_user_directives ( env_filter, pattern) ?;
287297 }
288298
289299 // If we're only logging `INFO` entries then we'll use a simplified logging format.
@@ -293,19 +303,16 @@ pub fn init_logger(
293303 } ;
294304
295305 // Always log the special target `sc_tracing`, overrides global level.
306+ // Required because profiling traces are emitted via `sc_tracing`
296307 // NOTE: this must be done after we check the `max_level_hint` otherwise
297308 // it is always raised to `TRACE`.
298309 env_filter = env_filter. add_directive (
299- "sc_tracing=trace"
300- . parse ( )
301- . expect ( "provided directive is valid" ) ,
310+ parse_default_directive ( "sc_tracing=trace" ) . expect ( "provided directive is valid" )
302311 ) ;
303312
304313 // Make sure to include profiling targets in the filter
305314 if let Some ( profiling_targets) = profiling_targets. clone ( ) {
306- for directive in parse_directives ( profiling_targets) {
307- env_filter = env_filter. add_directive ( directive) ;
308- }
315+ env_filter = parse_user_directives ( env_filter, & profiling_targets) ?;
309316 }
310317
311318 let enable_color = atty:: is ( atty:: Stream :: Stderr ) ;
@@ -315,22 +322,42 @@ pub fn init_logger(
315322 "%Y-%m-%d %H:%M:%S%.3f" . to_string ( )
316323 } ) ;
317324
318- let subscriber = FmtSubscriber :: builder ( )
325+ let subscriber_builder = FmtSubscriber :: builder ( )
319326 . with_env_filter ( env_filter)
320- . with_writer ( std:: io:: stderr)
327+ . with_writer ( std:: io:: stderr as _ )
321328 . event_format ( logging:: EventFormat {
322329 timer,
330+ enable_color,
323331 display_target : !simple,
324332 display_level : !simple,
325333 display_thread_name : !simple,
326- enable_color,
327- } )
328- . finish ( )
329- . with ( logging:: NodeNameLayer ) ;
334+ } ) ;
335+ if disable_log_reloading {
336+ let subscriber = subscriber_builder
337+ . finish ( )
338+ . with ( logging:: NodeNameLayer ) ;
339+ initialize_tracing ( subscriber, tracing_receiver, profiling_targets)
340+ } else {
341+ let subscriber_builder = subscriber_builder. with_filter_reloading ( ) ;
342+ let handle = subscriber_builder. reload_handle ( ) ;
343+ sc_tracing:: set_reload_handle ( handle) ;
344+ let subscriber = subscriber_builder
345+ . finish ( )
346+ . with ( logging:: NodeNameLayer ) ;
347+ initialize_tracing ( subscriber, tracing_receiver, profiling_targets)
348+ }
349+ }
330350
351+ fn initialize_tracing < S > (
352+ subscriber : S ,
353+ tracing_receiver : sc_tracing:: TracingReceiver ,
354+ profiling_targets : Option < String > ,
355+ ) -> std:: result:: Result < ( ) , String >
356+ where
357+ S : tracing:: Subscriber + Send + Sync + ' static ,
358+ {
331359 if let Some ( profiling_targets) = profiling_targets {
332360 let profiling = sc_tracing:: ProfilingLayer :: new ( tracing_receiver, & profiling_targets) ;
333-
334361 if let Err ( e) = tracing:: subscriber:: set_global_default ( subscriber. with ( profiling) ) {
335362 return Err ( format ! (
336363 "Registering Substrate tracing subscriber failed: {:}!" , e
@@ -339,7 +366,7 @@ pub fn init_logger(
339366 } else {
340367 if let Err ( e) = tracing:: subscriber:: set_global_default ( subscriber) {
341368 return Err ( format ! (
342- "Registering Substrate tracing subscriber failed: {:}!" , e
369+ "Registering Substrate tracing subscriber failed: {:}!" , e
343370 ) )
344371 }
345372 }
@@ -356,7 +383,7 @@ mod tests {
356383 #[ test]
357384 fn test_logger_filters ( ) {
358385 let test_pattern = "afg=debug,sync=trace,client=warn,telemetry,something-with-dash=error" ;
359- init_logger ( & test_pattern, Default :: default ( ) , Default :: default ( ) ) . unwrap ( ) ;
386+ init_logger ( & test_pattern, Default :: default ( ) , Default :: default ( ) , false ) . unwrap ( ) ;
360387
361388 tracing:: dispatcher:: get_default ( |dispatcher| {
362389 let test_filter = |target, level| {
@@ -415,7 +442,7 @@ mod tests {
415442 fn log_something_with_dash_target_name ( ) {
416443 if env:: var ( "ENABLE_LOGGING" ) . is_ok ( ) {
417444 let test_pattern = "test-target=info" ;
418- init_logger ( & test_pattern, Default :: default ( ) , Default :: default ( ) ) . unwrap ( ) ;
445+ init_logger ( & test_pattern, Default :: default ( ) , Default :: default ( ) , false ) . unwrap ( ) ;
419446
420447 log:: info!( target: "test-target" , "{}" , EXPECTED_LOG_MESSAGE ) ;
421448 }
@@ -450,7 +477,8 @@ mod tests {
450477 #[ test]
451478 fn prefix_in_log_lines_entrypoint ( ) {
452479 if env:: var ( "ENABLE_LOGGING" ) . is_ok ( ) {
453- init_logger ( "" , Default :: default ( ) , Default :: default ( ) ) . unwrap ( ) ;
480+ let test_pattern = "test-target=info" ;
481+ init_logger ( & test_pattern, Default :: default ( ) , Default :: default ( ) , false ) . unwrap ( ) ;
454482 prefix_in_log_lines_process ( ) ;
455483 }
456484 }
@@ -466,7 +494,7 @@ mod tests {
466494 #[ test]
467495 fn do_not_write_with_colors_on_tty_entrypoint ( ) {
468496 if env:: var ( "ENABLE_LOGGING" ) . is_ok ( ) {
469- init_logger ( "" , Default :: default ( ) , Default :: default ( ) ) . unwrap ( ) ;
497+ init_logger ( "" , Default :: default ( ) , Default :: default ( ) , false ) . unwrap ( ) ;
470498 log:: info!( "{}" , ansi_term:: Colour :: Yellow . paint( EXPECTED_LOG_MESSAGE ) ) ;
471499 }
472500 }
0 commit comments