1use tracing_subscriber::{
2 EnvFilter,
3 fmt,
4};
5
6use crate::config::EnvVars;
7
8pub 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 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}