1- use crate :: error:: Error ;
2- use std:: time:: SystemTime ;
1+ use crate :: { error:: Error , server :: config :: Config } ;
2+ use std:: { fs , time:: SystemTime } ;
33use tracing:: level_filters:: LevelFilter ;
4- use tracing_subscriber:: fmt:: {
5- format:: { FmtSpan , Writer } ,
6- time:: FormatTime ,
4+ use tracing_subscriber:: {
5+ fmt:: {
6+ format:: { FmtSpan , Writer } ,
7+ time:: FormatTime ,
8+ } ,
9+ layer:: SubscriberExt ,
10+ util:: SubscriberInitExt ,
711} ;
812
913struct DateTimeFormatter ;
@@ -16,21 +20,49 @@ impl FormatTime for DateTimeFormatter {
1620 }
1721}
1822
19- pub fn setup ( debug : bool ) -> Result < ( ) , Error > {
20- let level = if cfg ! ( debug_assertions) | debug {
23+ pub fn setup ( force_debug : bool , config : & Config ) -> Result < ( ) , Error > {
24+ let level = if cfg ! ( debug_assertions) | force_debug {
2125 LevelFilter :: DEBUG
2226 } else {
2327 LevelFilter :: INFO
2428 } ;
2529
26- let subscriber = tracing_subscriber:: fmt ( )
30+ let file_layer = if let Some ( path) = & config. logging . file {
31+ if !path. is_absolute ( ) {
32+ return Err ( Error :: IllegalLogfilePath ) ;
33+ }
34+
35+ let file = fs:: OpenOptions :: new ( )
36+ . create ( true )
37+ . write ( true )
38+ . truncate ( config. logging . erase_file_on_start )
39+ . append ( !config. logging . erase_file_on_start )
40+ . open ( path) ?;
41+
42+ let file_layer = tracing_subscriber:: fmt:: layer ( )
43+ . with_writer ( file)
44+ . with_ansi ( false )
45+ . compact ( )
46+ . with_timer ( DateTimeFormatter )
47+ . with_target ( false )
48+ . with_span_events ( FmtSpan :: CLOSE ) ;
49+
50+ Some ( file_layer)
51+ } else {
52+ None
53+ } ;
54+
55+ let stdout_layer = tracing_subscriber:: fmt:: layer ( )
2756 . compact ( )
2857 . with_timer ( DateTimeFormatter )
2958 . with_target ( false )
30- . with_max_level ( level)
31- . with_span_events ( FmtSpan :: CLOSE )
32- . finish ( ) ;
33- tracing:: subscriber:: set_global_default ( subscriber) ?;
59+ . with_span_events ( FmtSpan :: CLOSE ) ;
60+
61+ tracing_subscriber:: registry ( )
62+ . with ( stdout_layer)
63+ . with ( file_layer)
64+ . with ( level)
65+ . init ( ) ;
3466
3567 Ok ( ( ) )
3668}
0 commit comments