1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use env_logger::fmt::Color;
use log::{Level, LevelFilter};
use std::io::Write;

pub fn init(verbose: u64, is_server: bool) {
    let mut builder = env_logger::Builder::new();

    builder.format(move |buf, record| {
        let level_color = match record.level() {
            Level::Trace => Color::White,
            Level::Debug => Color::Blue,
            Level::Info => Color::Green,
            Level::Warn => Color::Yellow,
            Level::Error => Color::Red,
        };
        let mut level_style = buf.style();
        level_style.set_color(level_color);

        if is_server {
            if cfg!(debug_assertions) {
                writeln!(
                    buf,
                    "{level:5} {time} {file:>10}:{line:<4} {args}",
                    level = level_style.value(record.level()),
                    time = chrono::Utc::now().to_rfc3339(),
                    file = &record.file().unwrap_or("____unknown")[4..],
                    line = record.line().unwrap_or(0),
                    args = record.args(),
                )
            } else {
                writeln!(
                    buf,
                    "{level:5} {time} {args}",
                    level = level_style.value(record.level()),
                    time = chrono::Utc::now().to_rfc3339(),
                    args = record.args(),
                )
            }
        } else {
            writeln!(
                buf,
                "{level:5} {args}",
                level = level_style.value(record.level()),
                args = record.args(),
            )
        }
    });

    builder.filter(
        None,
        match verbose {
            0 => LevelFilter::Info,
            1 => LevelFilter::Debug,
            _ => LevelFilter::Trace,
        },
    );
    builder.write_style(env_logger::WriteStyle::Auto);

    builder.init();
}