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 timestamp = chrono::Local::now()
24                .format("%H:%M:%S%p")
25                .to_string()
26                .yellow()
27                .dimmed();
28
29            let style = buf.default_level_style(record.level());
30            let level_style = format!("{style}{}{style:#}", record.level());
31
32            let target_pretty = record
33                .target()
34                .split("::")
35                .next()
36                .unwrap_or_else(|| record.target());
37
38            writeln!(
39                buf,
40                "[{}] [{}] [{}]: {}",
41                timestamp,
42                level_style,
43                target_pretty,
44                record.args()
45            )
46        })
47        .format_level(true)
48        .write_style(WriteStyle::Always);
49
50    builder
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn test() {
59        build(Some(LevelFilter::Error)).init();
60        log::trace!("This is a test log");
61        log::debug!("This is a test log");
62        log::info!("This is a test log");
63        log::warn!("This is a test log");
64        log::error!("This is a test log");
65    }
66}