thin_logger/
lib.rs

1use colored::*;
2use env_logger::WriteStyle;
3use log::LevelFilter;
4use std::io::Write as _;
5
6pub use colored;
7pub use env_logger;
8pub use log;
9
10/// Creates a new `env_logger::Builder` instance with better defaults for logging.
11/// targets: `RUST_LOG=[target][=][level][,...]`
12pub fn build(log_lvl: Option<LevelFilter>) -> env_logger::Builder {
13    let mut builder = env_logger::builder();
14
15    builder.parse_env("RUST_LOG");
16
17    if let Some(log_lvl) = log_lvl {
18        builder.filter(None, log_lvl);
19    }
20
21    builder
22        .format(|buf, record| {
23            let style = buf.default_level_style(record.level());
24            let level_style = format!("{style}{}{style:#}", record.level());
25
26            let target_pretty = record
27                .target()
28                .split("::")
29                .next()
30                .unwrap_or_else(|| record.target());
31
32            if cfg!(debug_assertions) {
33                writeln!(
34                    buf,
35                    "[{}] [{}]: {}",
36                    level_style,
37                    target_pretty,
38                    record.args()
39                )
40            } else {
41                let timestamp = chrono::Local::now()
42                    .format("%I:%M:%S%p")
43                    .to_string()
44                    .yellow()
45                    .dimmed();
46
47                writeln!(
48                    buf,
49                    "[{}] [{}] [{}]: {}",
50                    timestamp,
51                    level_style,
52                    target_pretty,
53                    record.args()
54                )
55            }
56        })
57        .format_level(true)
58        .write_style(WriteStyle::Always);
59
60    builder
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn test() {
69        build(Some(LevelFilter::Error)).init();
70        log::trace!("This is a test log");
71        log::debug!("This is a test log");
72        log::info!("This is a test log");
73        log::warn!("This is a test log");
74        log::error!("This is a test log");
75    }
76}