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}