@@ -32,10 +32,7 @@ pub use arg_enums::*;
3232pub use commands:: * ;
3333pub use config:: * ;
3434pub use error:: * ;
35- use lazy_static:: lazy_static;
36- use log:: info;
3735pub use params:: * ;
38- use regex:: Regex ;
3936pub use runner:: * ;
4037use sc_service:: { Configuration , TaskExecutor } ;
4138pub use sc_service:: { ChainSpec , Role } ;
@@ -46,6 +43,7 @@ use structopt::{
4643 clap:: { self , AppSettings } ,
4744 StructOpt ,
4845} ;
46+ use tracing_subscriber:: layer:: SubscriberExt ;
4947
5048/// Substrate client CLI
5149///
@@ -228,79 +226,76 @@ pub trait SubstrateCli: Sized {
228226 fn native_runtime_version ( chain_spec : & Box < dyn ChainSpec > ) -> & ' static RuntimeVersion ;
229227}
230228
231- /// Initialize the logger
232- pub fn init_logger ( pattern : & str ) {
233- use ansi_term:: Colour ;
234-
235- let mut builder = env_logger:: Builder :: new ( ) ;
236- // Disable info logging by default for some modules:
237- builder. filter ( Some ( "ws" ) , log:: LevelFilter :: Off ) ;
238- builder. filter ( Some ( "yamux" ) , log:: LevelFilter :: Off ) ;
239- builder. filter ( Some ( "cranelift_codegen" ) , log:: LevelFilter :: Off ) ;
240- builder. filter ( Some ( "hyper" ) , log:: LevelFilter :: Warn ) ;
241- builder. filter ( Some ( "cranelift_wasm" ) , log:: LevelFilter :: Warn ) ;
242- // Always log the special target `sc_tracing`, overrides global level
243- builder. filter ( Some ( "sc_tracing" ) , log:: LevelFilter :: Trace ) ;
244- // Enable info for others.
245- builder. filter ( None , log:: LevelFilter :: Info ) ;
229+ /// Initialize the global logger
230+ ///
231+ /// This sets various global logging and tracing instances and thus may only be called once.
232+ pub fn init_logger (
233+ pattern : & str ,
234+ tracing_receiver : sc_tracing:: TracingReceiver ,
235+ tracing_targets : Option < String > ,
236+ ) -> std:: result:: Result < ( ) , String > {
237+ if let Err ( e) = tracing_log:: LogTracer :: init ( ) {
238+ return Err ( format ! (
239+ "Registering Substrate logger failed: {:}!" , e
240+ ) )
241+ }
242+
243+ let mut env_filter = tracing_subscriber:: EnvFilter :: default ( )
244+ // Disable info logging by default for some modules.
245+ . add_directive ( "ws=off" . parse ( ) . expect ( "provided directive is valid" ) )
246+ . add_directive ( "yamux=off" . parse ( ) . expect ( "provided directive is valid" ) )
247+ . add_directive ( "cranelift_codegen=off" . parse ( ) . expect ( "provided directive is valid" ) )
248+ // Set warn logging by default for some modules.
249+ . add_directive ( "cranelife_wasm=warn" . parse ( ) . expect ( "provided directive is valid" ) )
250+ . add_directive ( "hyper=warn" . parse ( ) . expect ( "provided directive is valid" ) )
251+ // Always log the special target `sc_tracing`, overrides global level.
252+ . add_directive ( "sc_tracing=trace" . parse ( ) . expect ( "provided directive is valid" ) )
253+ // Enable info for others.
254+ . add_directive ( tracing_subscriber:: filter:: LevelFilter :: INFO . into ( ) ) ;
246255
247256 if let Ok ( lvl) = std:: env:: var ( "RUST_LOG" ) {
248- builder. parse_filters ( & lvl) ;
257+ if lvl != "" {
258+ // We're not sure if log or tracing is available at this moment, so silently ignore the
259+ // parse error.
260+ if let Ok ( directive) = lvl. parse ( ) {
261+ env_filter = env_filter. add_directive ( directive) ;
262+ }
263+ }
264+ }
265+
266+ if pattern != "" {
267+ // We're not sure if log or tracing is available at this moment, so silently ignore the
268+ // parse error.
269+ if let Ok ( directive) = pattern. parse ( ) {
270+ env_filter = env_filter. add_directive ( directive) ;
271+ }
249272 }
250273
251- builder. parse_filters ( pattern) ;
252274 let isatty = atty:: is ( atty:: Stream :: Stderr ) ;
253275 let enable_color = isatty;
254276
255- builder. format ( move |buf, record| {
256- let now = time:: now ( ) ;
257- let timestamp =
258- time:: strftime ( "%Y-%m-%d %H:%M:%S" , & now) . expect ( "Error formatting log timestamp" ) ;
259-
260- let mut output = if log:: max_level ( ) <= log:: LevelFilter :: Info {
261- format ! (
262- "{} {}" ,
263- Colour :: Black . bold( ) . paint( timestamp) ,
264- record. args( ) ,
265- )
266- } else {
267- let name = :: std:: thread:: current ( )
268- . name ( )
269- . map_or_else ( Default :: default, |x| {
270- format ! ( "{}" , Colour :: Blue . bold( ) . paint( x) )
271- } ) ;
272- let millis = ( now. tm_nsec as f32 / 1000000.0 ) . floor ( ) as usize ;
273- let timestamp = format ! ( "{}.{:03}" , timestamp, millis) ;
274- format ! (
275- "{} {} {} {} {}" ,
276- Colour :: Black . bold( ) . paint( timestamp) ,
277- name,
278- record. level( ) ,
279- record. target( ) ,
280- record. args( )
281- )
282- } ;
283-
284- if !isatty && record. level ( ) <= log:: Level :: Info && atty:: is ( atty:: Stream :: Stdout ) {
285- // duplicate INFO/WARN output to console
286- println ! ( "{}" , output) ;
277+ let subscriber = tracing_subscriber:: FmtSubscriber :: builder ( )
278+ . with_env_filter ( env_filter)
279+ . with_target ( false )
280+ . with_ansi ( enable_color)
281+ . with_writer ( std:: io:: stderr)
282+ . compact ( )
283+ . finish ( ) ;
284+
285+ if let Some ( tracing_targets) = tracing_targets {
286+ let profiling = sc_tracing:: ProfilingLayer :: new ( tracing_receiver, & tracing_targets) ;
287+
288+ if let Err ( e) = tracing:: subscriber:: set_global_default ( subscriber. with ( profiling) ) {
289+ return Err ( format ! (
290+ "Registering Substrate tracing subscriber failed: {:}!" , e
291+ ) )
287292 }
288-
289- if !enable_color {
290- output = kill_color ( output. as_ref ( ) ) ;
293+ } else {
294+ if let Err ( e) = tracing:: subscriber:: set_global_default ( subscriber) {
295+ return Err ( format ! (
296+ "Registering Substrate tracing subscriber failed: {:}!" , e
297+ ) )
291298 }
292-
293- writeln ! ( buf, "{}" , output)
294- } ) ;
295-
296- if builder. try_init ( ) . is_err ( ) {
297- info ! ( "💬 Not registering Substrate logger, as there is already a global logger registered!" ) ;
298- }
299- }
300-
301- fn kill_color ( s : & str ) -> String {
302- lazy_static ! {
303- static ref RE : Regex = Regex :: new( "\x1b \\ [[^m]+m" ) . expect( "Error initializing color regex" ) ;
304299 }
305- RE . replace_all ( s , "" ) . to_string ( )
300+ Ok ( ( ) )
306301}
0 commit comments