use std::fs::OpenOptions;
use std::io::Write;
use std::path::PathBuf;
use env_logger::{Builder, Target};
pub enum LogTarget {
Stderr,
Stdout,
File(PathBuf),
Pipe(Box<dyn Write + Send + 'static>),
}
pub fn init(default_level: &str) {
init_with(default_level, LogTarget::Stderr);
}
pub fn init_with(default_level: &str, target: LogTarget) {
let level = std::env::var("MW75_LOG")
.or_else(|_| std::env::var("RUST_LOG"))
.unwrap_or_else(|_| default_level.to_string());
let target = match std::env::var("MW75_LOG_FILE") {
Ok(path) if !path.is_empty() => LogTarget::File(path.into()),
_ => target,
};
let mut builder = Builder::new();
builder.parse_filters(&level);
match target {
LogTarget::Stderr => {
builder.target(Target::Stderr);
}
LogTarget::Stdout => {
builder.target(Target::Stdout);
}
LogTarget::File(path) => match OpenOptions::new().create(true).append(true).open(&path) {
Ok(file) => {
builder.target(Target::Pipe(Box::new(file)));
}
Err(e) => {
eprintln!("mw75: cannot open log file {path:?}: {e} — logging to stderr");
builder.target(Target::Stderr);
}
},
LogTarget::Pipe(writer) => {
builder.target(Target::Pipe(writer));
}
}
let _ = builder.try_init();
}