Skip to main content

shadow_utils/
logging.rs

1//! Logging configuration
2
3use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
4
5/// Logging configuration
6#[derive(Debug, Clone)]
7pub struct LogConfig {
8    /// Log level (trace, debug, info, warn, error)
9    pub level: String,
10    /// Enable JSON formatting
11    pub json: bool,
12    /// Log to file
13    pub file: Option<String>,
14}
15
16impl Default for LogConfig {
17    fn default() -> Self {
18        Self {
19            level: "info".to_string(),
20            json: false,
21            file: None,
22        }
23    }
24}
25
26/// Initialize logging system
27pub fn init_logging(config: LogConfig) {
28    let filter = EnvFilter::try_from_default_env()
29        .unwrap_or_else(|_| EnvFilter::new(&config.level));
30
31    // Simple formatting without json option
32    tracing_subscriber::registry()
33        .with(filter)
34        .with(tracing_subscriber::fmt::layer())
35        .init();
36}
37
38/// Initialize with default configuration
39pub fn init_default_logging() {
40    init_logging(LogConfig::default());
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_log_config_default() {
49        let config = LogConfig::default();
50        assert_eq!(config.level, "info");
51        assert!(!config.json);
52        assert!(config.file.is_none());
53    }
54}