use std::io;
use colored::Colorize;
use fern::colors::{Color, ColoredLevelConfig};
use fern::Dispatch;
use log::{Level, LevelFilter};
use chrono::Utc;
use super::config::Config;
pub fn configure_logging(config: &Config) {
let colors = ColoredLevelConfig::new()
.info(Color::Green)
.warn(Color::Yellow)
.error(Color::Red)
.debug(Color::Magenta)
.trace(Color::Cyan);
let date_time_format = config.date_time_format.clone();
Dispatch::new()
.format(move |out, message, record| {
out.finish(format_args!(
"[{time}] [{level}] {sender}: {message}",
time = Utc::now().format(&date_time_format)
.to_string()
.magenta(),
level = colors.color(record.level()).to_string().underline(),
sender = record.target().on_blue(),
message = {
match record.level() {
Level::Error => format!("{}", message).on_red(),
Level::Warn => format!("{}", message).on_yellow(),
Level::Info => format!("{}", message).on_green(),
_ => format!("{}", message).normal(),
}
},
));
})
.chain(
Dispatch::new()
.filter(move |metadata| match metadata.level() {
Level::Info | Level::Warn | Level::Error => false,
Level::Debug | Level::Trace => true,
})
.chain(io::stderr()),
)
.chain(
Dispatch::new()
.filter(move |metadata| match metadata.level() {
Level::Info | Level::Warn | Level::Error => true,
Level::Debug | Level::Trace => false,
})
.chain(io::stdout()),
)
.level(num2level(config.verbosity))
.apply()
.expect("Cannot apply logging config");
}
fn num2level(level: i32) -> LevelFilter {
match level {
0 => LevelFilter::Off,
1 => LevelFilter::Error,
2 => LevelFilter::Warn,
3 => LevelFilter::Info,
4 => LevelFilter::Debug,
5 => LevelFilter::Trace,
_ => panic!("Log level not supported"),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_num2level() {
assert_eq!(num2level(0), LevelFilter::Off);
assert_eq!(num2level(1), LevelFilter::Error);
assert_eq!(num2level(2), LevelFilter::Warn);
assert_eq!(num2level(3), LevelFilter::Info);
assert_eq!(num2level(4), LevelFilter::Debug);
assert_eq!(num2level(5), LevelFilter::Trace);
}
}