Skip to main content

zerv/
logging.rs

1use tracing_subscriber::{
2    EnvFilter,
3    fmt,
4};
5
6use crate::config::EnvVars;
7
8/// Initialize logging based on --verbose flag and RUST_LOG environment variable
9///
10/// Verbosity levels (simple and practical):
11/// - false (default): error only
12/// - true (-v / --verbose): debug (sufficient for all debugging)
13///
14/// Priority order:
15/// 1. RUST_LOG environment variable (if set) - full control
16/// 2. --verbose flag - enables debug level
17/// 3. Default - error level only (Rust standard)
18pub fn init_logging(verbose: bool) {
19    let config = crate::config::ZervConfig::load().unwrap_or_default();
20    let filter = if config.should_force_rust_log_off() {
21        // ZERV_FORCE_RUST_LOG_OFF is set to true/1 - force logging off for CI
22        EnvFilter::new("off")
23    } else if let Ok(rust_log) = std::env::var(EnvVars::RUST_LOG) {
24        EnvFilter::new(rust_log)
25    } else if verbose {
26        EnvFilter::new("zerv=debug")
27    } else {
28        EnvFilter::new("error")
29    };
30
31    let _result = fmt()
32        .with_writer(std::io::stderr)
33        .with_env_filter(filter)
34        .with_target(false)
35        .compact()
36        .try_init();
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn test_init_logging_does_not_panic() {
45        let result = std::panic::catch_unwind(|| {
46            init_logging(false);
47        });
48        assert!(
49            result.is_ok(),
50            "init_logging should not panic with verbose=false"
51        );
52    }
53
54    #[test]
55    fn test_init_logging_with_verbose_flag() {
56        let result = std::panic::catch_unwind(|| {
57            init_logging(true);
58        });
59        assert!(
60            result.is_ok(),
61            "init_logging should not panic with verbose=true"
62        );
63    }
64
65    #[test]
66    fn test_init_logging_with_rust_log_env() {
67        unsafe {
68            std::env::set_var(EnvVars::RUST_LOG, "debug");
69        }
70        let result = std::panic::catch_unwind(|| {
71            init_logging(false);
72        });
73        unsafe {
74            std::env::remove_var(EnvVars::RUST_LOG);
75        }
76        assert!(
77            result.is_ok(),
78            "init_logging should not panic with RUST_LOG set"
79        );
80    }
81}