//! Logging Initialization //! //! Sets up tracing with systemd journal and file appender support. use anyhow::Result; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; /// Initialize logging with tracing /// /// Sets up: /// - Env-based log level filtering /// - JSON formatting for machine readability /// - systemd journal integration /// - File appender fallback to /var/log/linux_patch_api/ pub fn init_logging(verbose: bool) -> Result { let log_level = if verbose { "debug" } else { "info" }; let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(log_level)); let file_appender = tracing_appender::rolling::daily("/var/log/linux_patch_api", "audit.log"); let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); let file_layer = fmt::layer() .with_writer(non_blocking) .with_ansi(false) .with_target(true) .with_thread_ids(true); let stdout_layer = fmt::layer().with_writer(std::io::stdout).with_ansi(true); tracing_subscriber::registry() .with(filter) .with(file_layer) .with(stdout_layer) .try_init() .ok(); // Ignore if already initialized Ok(guard) }