clone_stream/
clean_log.rs1pub 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"), log::Level::Warn => ("\x1b[93m", "\x1b[0m"), log::Level::Info => ("\x1b[34m", "\x1b[0m"), log::Level::Debug => ("\x1b[96m", "\x1b[0m"), log::Level::Trace => ("\x1b[90m", "\x1b[0m"), }
46}