pub fn init_logging_from_env(crate_name: &str) {
let env_key = env_key_for(crate_name);
let filter = tracing_subscriber::EnvFilter::try_from_env(&env_key)
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info"));
let _ = tracing_subscriber::fmt()
.with_env_filter(filter)
.with_writer(std::io::stderr)
.with_target(false)
.try_init();
}
fn env_key_for(crate_name: &str) -> String {
let mut out = String::with_capacity(crate_name.len() + 4);
for c in crate_name.chars() {
out.push(if c == '-' { '_' } else { c.to_ascii_uppercase() });
}
out.push_str("_LOG");
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn env_key_uppercases_and_replaces_dashes() {
assert_eq!(env_key_for("agent-creator"), "AGENT_CREATOR_LOG");
assert_eq!(env_key_for("ventas_etb"), "VENTAS_ETB_LOG");
assert_eq!(env_key_for("simple"), "SIMPLE_LOG");
}
#[test]
fn init_is_idempotent() {
init_logging_from_env("test-crate");
init_logging_from_env("test-crate");
}
}