use std::io::Write;
#[cfg(test)]
#[path = "tests.rs"]
mod tests;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum LogFormat {
Text,
Json,
}
impl LogFormat {
fn parse(value: Option<&str>) -> Self {
match value {
Some(value) if value.eq_ignore_ascii_case("json") => Self::Json,
_ => Self::Text,
}
}
}
fn format_json_line(record: &log::Record<'_>) -> String {
serde_json::json!({
"ts": chrono::Utc::now().to_rfc3339(),
"level": record.level().to_string(),
"target": record.target(),
"msg": record.args().to_string(),
})
.to_string()
}
pub fn init() {
let mut builder =
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info"));
if LogFormat::parse(std::env::var("MOADIM_LOG_FORMAT").ok().as_deref()) == LogFormat::Json {
builder.format(|buf, record| writeln!(buf, "{}", format_json_line(record)));
}
let _ = builder.try_init();
}