use anyhow::Result; use std::env; use std::fs::create_dir_all; use std::str::FromStr; use log::debug; pub fn setup_logger() -> Result<()> { let log_file = env::var("LOG_FILE").or_else(|_| { create_dir_all("logs/")?; anyhow::Ok(format!( "logs/{}_{}.log", env!("CARGO_PKG_NAME"), chrono::Local::now().format("%Y%m%d_%H%M%S") )) })?; let log_level = match env::var("LOG_LEVEL") { Ok(log_level) => log::LevelFilter::from_str(&log_level).unwrap_or(log::LevelFilter::Info), Err(_) => log::LevelFilter::Info, }; fern::Dispatch::new() .format(|out, message, record| { out.finish(format_args!( "[{}][{}][{}] {}", chrono::Local::now().format("%Y-%m-%d %H:%M:%S"), record.target(), record.level(), message )) }) .chain( fern::Dispatch::new() .level(log_level) .chain(std::io::stdout()), ) .chain(fern::log_file(log_file.clone())?) .apply()?; debug!("Logging to {} at level {}", log_file, log_level); Ok(()) }