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, }
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}