use env_logger::fmt::style::{AnsiColor, Effects, Style};
use env_logger::fmt::Formatter;
use log::Record;
use std::io::Write;
use log::Level;
fn colored_level(level: Level, color_enabled: bool) -> String {
let level_str = match level {
Level::Error => "ERROR",
Level::Warn => "WARN ",
Level::Info => "INFO ",
Level::Debug => "DEBUG",
Level::Trace => "TRACE",
};
if color_enabled {
let style: Style = match level {
Level::Error => AnsiColor::Red.on_default().effects(Effects::BOLD),
Level::Warn => AnsiColor::Yellow.on_default().effects(Effects::BOLD),
Level::Info => AnsiColor::Green.on_default(),
Level::Debug => AnsiColor::Blue.on_default(),
Level::Trace => AnsiColor::Magenta.on_default(),
};
format!("{style}{level_str}{style:#}")
} else {
level_str.to_string()
}
}
pub fn format_logger(buf: &mut Formatter, record: &Record) -> std::io::Result<()> {
let color_enabled = std::env::var("MY_LOG_STYLE")
.map(|s| s != "never")
.unwrap_or(true);
let ts = buf.timestamp();
let level = colored_level(record.level(), color_enabled);
let target = record.target();
let file_line = match (record.file(), record.line()) {
(Some(file), Some(line)) => format!("{file}:{line}"),
_ => String::new(),
};
writeln!(
buf,
"{} {} [{} - {}] {}",
ts,
level,
target,
file_line,
record.args(),
)
}