use std::fs::File;
use std::path::Path;
use tracing::Level;
use tracing_subscriber::fmt;
use tracing_subscriber::EnvFilter;
pub fn verbose_to_level(verbose: u8) -> &'static str {
match verbose {
0 => "info",
1 => "debug",
_ => "trace", }
}
pub fn init_logging(level: &str, format: &str, log_file: Option<&Path>) {
let level = match level {
"error" => Level::ERROR,
"warn" => Level::WARN,
"info" => Level::INFO,
"debug" => Level::DEBUG,
"trace" => Level::TRACE,
_ => Level::INFO,
};
let env_filter = EnvFilter::try_from_default_env()
.or_else(|_| EnvFilter::try_new(level.as_str()))
.unwrap_or_else(|_| EnvFilter::new("info"));
match (format, log_file) {
("json", Some(path)) => {
let file = File::create(path).expect("Failed to create log file");
fmt()
.json()
.with_env_filter(env_filter)
.with_writer(move || file.try_clone().expect("Failed to clone file"))
.init();
}
("json", None) => {
fmt()
.json()
.with_env_filter(env_filter)
.with_writer(std::io::stderr)
.init();
}
(_, Some(path)) => {
let file = File::create(path).expect("Failed to create log file");
fmt()
.with_env_filter(env_filter)
.with_writer(move || file.try_clone().expect("Failed to clone file"))
.init();
}
_ => {
fmt()
.with_env_filter(env_filter)
.with_writer(std::io::stderr)
.init();
}
}
}