use once_cell::sync::OnceCell; use ops_sat_rs::config::LOG_FOLDER; use std::path::{Path, PathBuf}; pub static LOGFILE_PATH: OnceCell = OnceCell::new(); pub fn setup_logger() -> Result<(), fern::InitError> { if !Path::new(LOG_FOLDER).exists() && std::fs::create_dir_all(LOG_FOLDER).is_err() { eprintln!("Failed to create log folder '{}'", LOG_FOLDER); } let mut path_buf = PathBuf::from(LOG_FOLDER); path_buf.push( format!( "output_{}.log", humantime::format_rfc3339_seconds(std::time::SystemTime::now()) ) .replace(':', "_"), ); println!("Creating logfile {:?}", path_buf); LOGFILE_PATH .set(path_buf.clone()) .expect("Error setting global logfile path"); fern::Dispatch::new() .format(move |out, message, record| { out.finish(format_args!( "[{}][{}][{}] {}", humantime::format_rfc3339_millis(std::time::SystemTime::now()), std::thread::current().name().unwrap_or("unnamed_thread"), record.level(), message )) }) .level(log::LevelFilter::Debug) .chain(std::io::stdout()) .chain(fern::log_file(path_buf.as_os_str())?) .apply()?; Ok(()) }