ipc_broker/
logger.rs

1use std::io;
2
3use chrono::Local;
4use fern::Dispatch;
5use log::LevelFilter;
6
7fn logging_level() -> LevelFilter {
8    match std::env::var("BROKER_DEBUG").as_deref() {
9        Ok("trace") => LevelFilter::Trace,
10        Ok("debug") => LevelFilter::Debug,
11        Ok("info") => LevelFilter::Info,
12        Ok("warn") => LevelFilter::Warn,
13        Ok("error") => LevelFilter::Error,
14        _ => LevelFilter::Info, // default if unset or unknown
15    }
16}
17
18pub fn setup_logger() {
19    let level_filter = logging_level();
20
21    if let Err(e) = Dispatch::new()
22        .format(move |out, message, record| {
23            let file = record.file().unwrap_or("unknown_file");
24            let line = record.line().map_or(0, |l| l);
25
26            match level_filter {
27                LevelFilter::Off
28                | LevelFilter::Error
29                | LevelFilter::Warn
30                | LevelFilter::Debug
31                | LevelFilter::Trace => {
32                    out.finish(format_args!(
33                        "[{}][{}]: {} <{}:{}>",
34                        Local::now().format("%b-%d-%Y %H:%M:%S.%f"),
35                        record.level(),
36                        message,
37                        file,
38                        line,
39                    ));
40                }
41                LevelFilter::Info => {
42                    out.finish(format_args!(
43                        "[{}]: {} <{}:{}>",
44                        record.level(),
45                        message,
46                        file,
47                        line,
48                    ));
49                }
50            }
51        })
52        .level(level_filter)
53        .chain(io::stdout())
54        .apply()
55    {
56        log::error!("Logger initialization failed: {e}");
57    }
58}