clone_stream/
clean_log.rs

1pub fn log() {
2    env_logger::builder()
3        .format(format_log_record)
4        .filter_level(log::LevelFilter::Trace)
5        .try_init()
6        .ok();
7}
8
9fn format_log_record(
10    buf: &mut env_logger::fmt::Formatter,
11    record: &log::Record,
12) -> std::io::Result<()> {
13    use std::io::Write;
14
15    let relative_file = get_relative_file_path(record);
16    let (color_start, color_end) = get_level_colors(record.level());
17
18    writeln!(
19        buf,
20        "{}{}:{} {}{}",
21        color_start,
22        relative_file,
23        record.line().unwrap_or(0),
24        record.args(),
25        color_end
26    )
27}
28
29fn get_relative_file_path<'a>(record: &'a log::Record) -> &'a str {
30    let file = record.file().unwrap_or("unknown");
31    std::env::current_dir()
32        .ok()
33        .and_then(|cwd| file.strip_prefix(&*cwd.to_string_lossy()))
34        .unwrap_or(file)
35        .trim_start_matches('/')
36}
37
38fn get_level_colors(level: log::Level) -> (&'static str, &'static str) {
39    match level {
40        log::Level::Error => ("\x1b[91m", "\x1b[0m"), // Red
41        log::Level::Warn => ("\x1b[93m", "\x1b[0m"),  // Yellow
42        log::Level::Info => ("\x1b[34m", "\x1b[0m"),  // Dark blue
43        log::Level::Debug => ("\x1b[96m", "\x1b[0m"), // Cyan
44        log::Level::Trace => ("\x1b[90m", "\x1b[0m"), // Gray
45    }
46}