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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use std::io::Write;
pub fn init_logging(mut level: clap_verbosity_flag::Verbosity, colored: bool) {
level.set_default(Some(log::Level::Info));
if let Some(level) = level.log_level() {
let palette = if colored {
Palette::colored()
} else {
Palette::plain()
};
let mut builder = env_logger::Builder::new();
builder.write_style(if colored {
env_logger::WriteStyle::Always
} else {
env_logger::WriteStyle::Never
});
builder.filter(None, level.to_level_filter());
if level == log::LevelFilter::Trace || level == log::LevelFilter::Debug {
builder.format_timestamp_secs();
} else {
builder.format(move |f, record| match record.level() {
log::Level::Error => writeln!(
f,
"{}: {}",
palette.error.paint(record.level()),
record.args()
),
log::Level::Warn => writeln!(
f,
"{}: {}",
palette.warn.paint(record.level()),
record.args()
),
log::Level::Info => writeln!(f, "{}", record.args()),
log::Level::Debug => writeln!(
f,
"{}: {}",
palette.debug.paint(record.level()),
record.args()
),
log::Level::Trace => writeln!(
f,
"{}: {}",
palette.trace.paint(record.level()),
record.args()
),
});
}
builder.init();
}
}
#[derive(Copy, Clone, Debug)]
struct Palette {
error: yansi::Style,
warn: yansi::Style,
debug: yansi::Style,
trace: yansi::Style,
}
impl Palette {
pub fn colored() -> Self {
Self {
error: yansi::Style::new(yansi::Color::Red).bold(),
warn: yansi::Style::new(yansi::Color::Yellow),
debug: yansi::Style::new(yansi::Color::Blue),
trace: yansi::Style::new(yansi::Color::Cyan),
}
}
pub fn plain() -> Self {
Self {
error: yansi::Style::default(),
warn: yansi::Style::default(),
debug: yansi::Style::default(),
trace: yansi::Style::default(),
}
}
}