Skip to main content

dinglebit_log/
lib.rs

1use chrono::Utc;
2use dinglebit_terminal::style;
3use hostname;
4use log::{Level, LevelFilter, Metadata, Record};
5
6pub struct ColorLogger {
7    host: String,
8    verbose: bool,
9}
10
11impl ColorLogger {
12    pub fn init(filter: LevelFilter, verbose: bool) {
13        let s = Self {
14            host: hostname::get().unwrap().into_string().unwrap(),
15            verbose: verbose,
16        };
17        log::set_boxed_logger(Box::new(s)).unwrap();
18        log::set_max_level(filter);
19    }
20}
21
22impl log::Log for ColorLogger {
23    fn enabled(&self, metadata: &Metadata) -> bool {
24        metadata.level() <= log::max_level()
25    }
26
27    fn log(&self, record: &Record) {
28        if self.enabled(record.metadata()) {
29            let mut l = match self.verbose {
30                true => style!(
31                    "{:5} | {} | {} | {} | {}:{}:{} | {}",
32                    record.level(),
33                    Utc::now(),
34                    self.host,
35                    record.target(),
36                    record.module_path().unwrap_or(""),
37                    record.file().unwrap_or(""),
38                    record.line().unwrap_or(0),
39                    record.args()
40                ),
41                false => style!("{:5} | {} | {}", record.level(), Utc::now(), record.args()),
42            };
43            match record.metadata().level() {
44                Level::Error => l.red(),
45                Level::Warn => l.magenta(),
46                Level::Info => l.white(),
47                Level::Debug => l.cyan(),
48                Level::Trace => l.gray(),
49            };
50            println!("{}", l);
51        }
52    }
53
54    fn flush(&self) {
55        println!("flush");
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    #[test]
62    fn it_works() {
63        assert_eq!(2 + 2, 4);
64    }
65}