1- use log:: info;
1+ use std:: str:: FromStr ;
2+ use std:: sync:: Once ;
3+
4+ use log:: { info, LevelFilter } ;
25
36use crate :: Configuration ;
47
8+ static INIT : Once = Once :: new ( ) ;
9+
510pub fn setup_logging ( cfg : & Configuration ) {
6- let log_level = match & cfg. log_level {
7- None => log:: LevelFilter :: Info ,
8- Some ( level) => match level. as_str ( ) {
9- "off" => log:: LevelFilter :: Off ,
10- "trace" => log:: LevelFilter :: Trace ,
11- "debug" => log:: LevelFilter :: Debug ,
12- "info" => log:: LevelFilter :: Info ,
13- "warn" => log:: LevelFilter :: Warn ,
14- "error" => log:: LevelFilter :: Error ,
15- _ => {
16- panic ! ( "Unknown log level encountered: '{}'" , level. as_str( ) ) ;
17- }
18- } ,
19- } ;
20-
21- if log_level == log:: LevelFilter :: Off {
11+ let level = config_level_or_default ( & cfg. log_level ) ;
12+
13+ if level == log:: LevelFilter :: Off {
2214 return ;
2315 }
2416
17+ INIT . call_once ( || {
18+ stdout_config ( level) ;
19+ } ) ;
20+ }
21+
22+ fn config_level_or_default ( log_level : & Option < String > ) -> LevelFilter {
23+ match log_level {
24+ None => log:: LevelFilter :: Info ,
25+ Some ( level) => LevelFilter :: from_str ( level) . unwrap ( ) ,
26+ }
27+ }
28+
29+ fn stdout_config ( level : LevelFilter ) {
2530 if let Err ( _err) = fern:: Dispatch :: new ( )
2631 . format ( |out, message, record| {
2732 out. finish ( format_args ! (
@@ -32,11 +37,12 @@ pub fn setup_logging(cfg: &Configuration) {
3237 message
3338 ) )
3439 } )
35- . level ( log_level )
40+ . level ( level )
3641 . chain ( std:: io:: stdout ( ) )
3742 . apply ( )
3843 {
3944 panic ! ( "Failed to initialize logging." )
4045 }
46+
4147 info ! ( "logging initialized." ) ;
4248}
0 commit comments