use log::LevelFilter; use rust_util::{simple_error, XResult}; use std::{env, fs}; const DEFAULT_LOG4RS_CONFIG: &str = r##"refresh_rate: 10 seconds appenders: file: kind: rolling_file path: "log/local_mini_kms_log.log" append: true encoder: pattern: "{d} - {m}{n}" policy: kind: compound trigger: kind: size limit: 100 mb roller: kind: fixed_window pattern: log/local_mini_kms_log.{}.log count: 10 root: level: info appenders: - file"##; pub fn init_logger(log_level: Option<&str>, log4rs_file: Option<&str>) -> XResult<()> { match log4rs_file { None => { let level = match env::var("LOGGER").ok().as_deref().map(get_log_level_filter) { Some(Ok(level)) => level, _ => log_level.map(get_log_level_filter).unwrap_or(Ok(LevelFilter::Debug))?, }; let _ = env_logger::builder().filter_level(level).try_init(); } Some(log4rs_file) => { let log4rs_config_file = if log4rs_file == "#DEFAULT" { let default_log4rs_file = "default_log4rs.yaml"; let _ = fs::metadata(default_log4rs_file).map_err(|_| { fs::write(default_log4rs_file, DEFAULT_LOG4RS_CONFIG).map_err(|e| { println!("Write file: {} failed: {}", default_log4rs_file, e); }) }); default_log4rs_file } else { log4rs_file }; log4rs::init_file(log4rs_config_file, Default::default())?; } } Ok(()) } fn get_log_level_filter(log_level: &str) -> XResult { Ok(match log_level { "trace" => LevelFilter::Trace, "debug" => LevelFilter::Debug, "info" => LevelFilter::Info, "warn" => LevelFilter::Warn, "error" => LevelFilter::Error, _ => { return simple_error!("invalid log_level"); } }) }