use tracing_subscriber::EnvFilter;
use crate::config::{ConfigError, LogFormat, ObservabilityConfig};
pub(crate) fn init(obs: &ObservabilityConfig) -> Result<(), ConfigError> {
let filter = env_filter(&obs.level)?;
match obs.format {
LogFormat::Json => tracing_subscriber::fmt()
.with_env_filter(filter)
.json()
.try_init(),
LogFormat::Pretty => tracing_subscriber::fmt()
.with_env_filter(filter)
.pretty()
.try_init(),
}
.ok();
Ok(())
}
fn env_filter(level: &str) -> Result<EnvFilter, ConfigError> {
let (what, spec) = std::env::var("RUST_LOG").map_or_else(
|_| ("observability.level", level.to_owned()),
|spec| ("RUST_LOG", spec),
);
EnvFilter::try_new(&spec)
.map_err(|error| ConfigError::Validation(format!("invalid {what} '{spec}': {error}")))
}