use log::{debug, error, info, trace, warn, LevelFilter};
use std::sync::Once;
static INIT: Once = Once::new();
pub fn init(level: Option<LevelFilter>) {
INIT.call_once(|| {
let env = env_logger::Env::default()
.filter_or("RUST_LOG", level.map_or("info", |l| match l {
LevelFilter::Trace => "trace",
LevelFilter::Debug => "debug",
LevelFilter::Info => "info",
LevelFilter::Warn => "warn",
LevelFilter::Error => "error",
LevelFilter::Off => "off",
}));
env_logger::Builder::from_env(env)
.format_timestamp_millis()
.format_target(true)
.init();
info!("Logging initialized at level: {}", log::max_level());
});
}
pub fn log_error<E: std::fmt::Display>(context: &str, err: E) -> E {
error!("{}: {}", context, err);
err
}
pub fn log_warning<E: std::fmt::Display>(context: &str, err: E) {
warn!("{}: {}", context, err);
}
pub fn log_debug<M: std::fmt::Display>(context: &str, msg: M) {
debug!("{}: {}", context, msg);
}
pub fn log_trace<M: std::fmt::Display>(context: &str, msg: M) {
trace!("{}: {}", context, msg);
}
pub fn log_info<M: std::fmt::Display>(context: &str, msg: M) {
info!("{}: {}", context, msg);
}