use std::{
fs::OpenOptions,
path::{Path, PathBuf},
};
use log::LevelFilter;
use simplelog::{Config, ConfigBuilder};
pub fn install(logname: impl AsRef<Path>) {
with_config(logname, default_config().build())
}
pub fn default_config() -> ConfigBuilder {
let mut config = ConfigBuilder::new();
config.set_thread_level(LevelFilter::Info);
config.set_target_level(LevelFilter::Info);
config
}
pub fn with_config(logname: impl AsRef<Path>, config: Config) {
use simplelog::*;
let mut loggers: Vec<Box<dyn SharedLogger>> = vec![TermLogger::new(
LevelFilter::Warn,
config.clone(),
TerminalMode::Stderr,
ColorChoice::Never,
)];
if cfg!(any(debug_assertions, feature = "release-logs")) {
let logdir = if cfg!(debug_assertions) {
std::env::current_dir().unwrap()
} else {
PathBuf::from("/var/log/cni")
};
let mut logfile = logdir.join(logname);
logfile.set_extension("log");
if let Some(dir) = logfile.parent() {
std::fs::create_dir_all(dir).unwrap();
}
loggers.push(WriteLogger::new(
LevelFilter::Debug,
config,
OpenOptions::new()
.append(true)
.create(true)
.open(logfile)
.unwrap(),
));
}
CombinedLogger::init(loggers).unwrap();
}