Skip to main content

mvm_cli/
logging.rs

1use tracing_subscriber::EnvFilter;
2use tracing_subscriber::fmt;
3use tracing_subscriber::prelude::*;
4
5/// Log output format.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum LogFormat {
8    /// Human-readable colored output (for interactive CLI use).
9    Human,
10    /// Structured JSON output (for daemon/agent mode).
11    Json,
12}
13
14/// Initialize the global tracing subscriber.
15///
16/// Call once at program startup. Respects `RUST_LOG` env var for filtering.
17/// Default filter: `mvm=info` (show info+ from mvm, warnings from dependencies).
18pub fn init(format: LogFormat) {
19    let env_filter =
20        EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("mvm=info,warn"));
21
22    match format {
23        LogFormat::Human => {
24            let subscriber = fmt::layer()
25                .with_target(false)
26                .with_thread_ids(false)
27                .compact();
28            tracing_subscriber::registry()
29                .with(env_filter)
30                .with(subscriber)
31                .init();
32        }
33        LogFormat::Json => {
34            let subscriber = fmt::layer().json().with_target(true);
35            tracing_subscriber::registry()
36                .with(env_filter)
37                .with(subscriber)
38                .init();
39        }
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_log_format_equality() {
49        assert_eq!(LogFormat::Human, LogFormat::Human);
50        assert_eq!(LogFormat::Json, LogFormat::Json);
51        assert_ne!(LogFormat::Human, LogFormat::Json);
52    }
53}