Skip to main content

mecha10_runtime/
logging.rs

1//! Logging initialization and configuration
2
3use crate::config::LogFormat;
4use tracing_subscriber::{fmt, prelude::*, EnvFilter};
5
6/// Initialize logging with the specified format and level
7///
8/// Note: This can only be called once per process. Subsequent calls will be ignored.
9pub fn init_logging(level: &str, format: LogFormat) {
10    // Precedence: LOG_LEVEL (plain debug/info/warn/error, the cross-language convention) >
11    // RUST_LOG (fine-grained per-module directive syntax, power-user override) > `level` param.
12    let env_filter = std::env::var("LOG_LEVEL")
13        .ok()
14        .map(EnvFilter::new)
15        .or_else(|| EnvFilter::try_from_default_env().ok())
16        .unwrap_or_else(|| EnvFilter::new(level));
17
18    let result = match format {
19        LogFormat::Pretty => tracing_subscriber::registry()
20            .with(env_filter)
21            .with(fmt::layer().pretty())
22            .try_init(),
23        LogFormat::Json => tracing_subscriber::registry()
24            .with(env_filter)
25            .with(fmt::layer().json().flatten_event(true))
26            .try_init(),
27        LogFormat::Compact => tracing_subscriber::registry()
28            .with(env_filter)
29            .with(fmt::layer().compact())
30            .try_init(),
31    };
32
33    // Ignore error if already initialized (happens in tests)
34    let _ = result;
35}