1use log::{debug, error, info, trace, warn, LevelFilter};
11use std::sync::Once;
12
13static INIT: Once = Once::new();
14
15pub fn init(level: Option<LevelFilter>) {
19 INIT.call_once(|| {
20 let env = env_logger::Env::default()
21 .filter_or("RUST_LOG", level.map_or("info", |l| match l {
22 LevelFilter::Trace => "trace",
23 LevelFilter::Debug => "debug",
24 LevelFilter::Info => "info",
25 LevelFilter::Warn => "warn",
26 LevelFilter::Error => "error",
27 LevelFilter::Off => "off",
28 }));
29
30 env_logger::Builder::from_env(env)
31 .format_timestamp_millis()
32 .format_target(true)
33 .init();
34
35 info!("Logging initialized at level: {}", log::max_level());
36 });
37}
38
39pub fn log_error<E: std::fmt::Display>(context: &str, err: E) -> E {
43 error!("{}: {}", context, err);
44 err
45}
46
47pub fn log_warning<E: std::fmt::Display>(context: &str, err: E) {
49 warn!("{}: {}", context, err);
50}
51
52pub fn log_debug<M: std::fmt::Display>(context: &str, msg: M) {
54 debug!("{}: {}", context, msg);
55}
56
57pub fn log_trace<M: std::fmt::Display>(context: &str, msg: M) {
59 trace!("{}: {}", context, msg);
60}
61
62pub fn log_info<M: std::fmt::Display>(context: &str, msg: M) {
64 info!("{}: {}", context, msg);
65}