11use std:: cmp;
22use std:: path:: PathBuf ;
3+ use std:: sync:: Mutex ;
34
45use cidr:: Ipv4Cidr ;
56use color_eyre:: eyre:: Result ;
@@ -9,9 +10,7 @@ use lazy_static::lazy_static;
910use std:: net:: Ipv4Addr ;
1011use tracing:: error;
1112use tracing_error:: ErrorLayer ;
12- use tracing_subscriber:: {
13- self , prelude:: __tracing_subscriber_SubscriberExt, util:: SubscriberInitExt , Layer ,
14- } ;
13+ use tracing_subscriber:: { Layer , layer:: SubscriberExt , util:: SubscriberInitExt } ;
1514
1615use crate :: components:: sniff:: IPTraffic ;
1716
@@ -122,7 +121,7 @@ pub fn initialize_panic_handler() -> Result<()> {
122121
123122 #[ cfg( not( debug_assertions) ) ]
124123 {
125- use human_panic:: { handle_dump , print_msg , Metadata } ;
124+ use human_panic:: { Metadata , handle_dump , print_msg } ;
126125 let meta = metadata ! ( )
127126 . authors ( "Chleba <chlebik@gmail.com>" )
128127 . homepage ( "https://github.com/Chleba/netscanner" )
@@ -176,26 +175,33 @@ pub fn get_config_dir() -> PathBuf {
176175
177176pub fn initialize_logging ( ) -> Result < ( ) > {
178177 let directory = get_data_dir ( ) ;
179- std:: fs:: create_dir_all ( directory. clone ( ) ) ?;
180- let log_path = directory. join ( LOG_FILE . clone ( ) ) ;
178+ std:: fs:: create_dir_all ( & directory) ?;
179+
180+ let log_path = directory. join ( & * LOG_FILE ) ;
181181 let log_file = std:: fs:: File :: create ( log_path) ?;
182- std:: env:: set_var (
183- "RUST_LOG" ,
184- std:: env:: var ( "RUST_LOG" )
185- . or_else ( |_| std:: env:: var ( LOG_ENV . clone ( ) ) )
186- . unwrap_or_else ( |_| format ! ( "{}=info" , env!( "CARGO_CRATE_NAME" ) ) ) ,
187- ) ;
182+
183+ let env_filter_str = std:: env:: var ( "RUST_LOG" )
184+ . or_else ( |_| std:: env:: var ( & * LOG_ENV ) )
185+ . unwrap_or_else ( |_| format ! ( "{}=info" , env!( "CARGO_CRATE_NAME" ) ) ) ;
186+
187+ let env_filter = tracing_subscriber:: filter:: EnvFilter :: new ( env_filter_str) ;
188+
189+ let log_file = Mutex :: new ( log_file) ;
190+
188191 let file_subscriber = tracing_subscriber:: fmt:: layer ( )
189192 . with_file ( true )
190193 . with_line_number ( true )
191- . with_writer ( log_file)
194+ . with_writer ( log_file) // Now accepts the Mutex<File>
192195 . with_target ( false )
193196 . with_ansi ( false )
194- . with_filter ( tracing_subscriber:: filter:: EnvFilter :: from_default_env ( ) ) ;
195- tracing_subscriber:: registry ( )
197+ . with_filter ( env_filter) ;
198+
199+ // 4. SAFETY: try_init prevents crashes if logging is initialized twice (e.g. tests)
200+ let _ = tracing_subscriber:: registry ( )
196201 . with ( file_subscriber)
197202 . with ( ErrorLayer :: default ( ) )
198- . init ( ) ;
203+ . try_init ( ) ;
204+
199205 Ok ( ( ) )
200206}
201207
0 commit comments