@@ -3,10 +3,13 @@ mod storage;
33use crate :: prelude:: * ;
44use log:: { Log , Metadata , Record } ;
55use std:: cell:: RefCell ;
6+ use std:: sync:: Once ;
67use std:: thread:: LocalKey ;
78
89pub use self :: storage:: LogStorage ;
910
11+ static INIT_LOGS : Once = Once :: new ( ) ;
12+
1013thread_local ! {
1114 static SCOPED : RefCell <Vec <Box <Log >>> = RefCell :: new( Vec :: new( ) ) ;
1215}
@@ -71,19 +74,29 @@ where
7174 result
7275}
7376
74- pub fn init ( ) -> Fallible < ( ) > {
75- // Initialize env_logger
76- // This doesn't use from_default_env() because it doesn't allow to override filter_module()
77- // with the RUST_LOG environment variable
78- let mut env = env_logger:: Builder :: new ( ) ;
79- env. filter_module ( "crater" , log:: LevelFilter :: Info ) ;
80- if let Ok ( content) = std:: env:: var ( "RUST_LOG" ) {
81- env. parse ( & content) ;
82- }
77+ pub fn init ( ) {
78+ INIT_LOGS . call_once ( || {
79+ // Initialize env_logger
80+ // This doesn't use from_default_env() because it doesn't allow to override filter_module()
81+ // with the RUST_LOG environment variable
82+ let mut env = env_logger:: Builder :: new ( ) ;
83+ env. filter_module ( "crater" , log:: LevelFilter :: Info ) ;
84+ if let Ok ( content) = std:: env:: var ( "RUST_LOG" ) {
85+ env. parse ( & content) ;
86+ }
8387
84- let multi = MultiLogger :: new ( vec ! [ Box :: new( env. build( ) ) ] , & SCOPED ) ;
85- log:: set_boxed_logger ( Box :: new ( multi) ) ?;
86- log:: set_max_level ( log:: LevelFilter :: Trace ) ;
88+ let multi = MultiLogger :: new ( vec ! [ Box :: new( env. build( ) ) ] , & SCOPED ) ;
89+ log:: set_boxed_logger ( Box :: new ( multi) ) . unwrap ( ) ;
90+ log:: set_max_level ( log:: LevelFilter :: Trace ) ;
91+ } ) ;
92+ }
8793
88- Ok ( ( ) )
94+ #[ cfg( test) ]
95+ pub ( crate ) fn init_test ( ) {
96+ INIT_LOGS . call_once ( || {
97+ // Avoid setting up ENV_LOGGER inside tests
98+ let multi = MultiLogger :: new ( vec ! [ ] , & SCOPED ) ;
99+ log:: set_boxed_logger ( Box :: new ( multi) ) . unwrap ( ) ;
100+ log:: set_max_level ( log:: LevelFilter :: Trace ) ;
101+ } )
89102}
0 commit comments