1use log::{Level, Metadata, Record};
2
3use crate::{get_offset_time, ConsoleLogger};
4
5impl log::Log for ConsoleLogger {
6 fn enabled(&self, metadata: &Metadata) -> bool {
7 metadata.level() <= self.0
8 }
9
10 fn log(&self, r: &Record) {
11 if !self.enabled(r.metadata()) {
12 return;
13 }
14
15 let lv = r.level();
16 let module = r.module_path().unwrap_or("");
17 let now = get_offset_time();
18 let offset_str = if now.offset().is_utc() { "Z" } else { "" };
19
20 let org_line = r.line().unwrap_or(0);
21 let line = {
22 use owo_colors::OwoColorize;
23 org_line.blue()
24 };
25
26 let colored_lv = {
27 use owo_colors::OwoColorize;
28 use Level::*;
29 let sty = owo_colors::Style::new();
30 match lv {
31 Error => lv.style(sty.red().bold()),
32 Warn => lv.style(sty.yellow().bold()),
33 Info => lv.style(sty.green()),
34 Debug => lv.style(sty.blue()),
35 _ => lv.style(sty.cyan()),
36 }
37 };
38
39 let fmt_str = format!(
40 "{hour:02}:{min:02}:{sec:02}.{ms:03}{offset_str} [{colored_lv}] {module}:{line} {args}",
41 hour = now.hour(),
42 min = now.minute(),
43 sec = now.second(),
44 ms = now.millisecond(),
45 args = r.args()
46 );
47 Self::output(lv as _, fmt_str.into());
48 }
49
50 fn flush(&self) {}
51}