telemetry.rs (1788B)
1 use std::path::Path; 2 use tracing_appender::non_blocking::WorkerGuard; 3 use tracing_appender::rolling; 4 use tracing_subscriber::{fmt, prelude::*, EnvFilter, Registry}; 5 6 #[cfg(feature = "audit")] 7 use tracing_subscriber::filter::Targets; 8 9 pub struct TelemetryGuards { 10 _file: WorkerGuard, 11 _audit: Option<WorkerGuard>, 12 } 13 14 pub fn init(logs_dir: impl AsRef<Path>) -> TelemetryGuards { 15 let logs_path = logs_dir.as_ref(); 16 if let Err(e) = std::fs::create_dir_all(logs_path) { 17 eprintln!("Failed to create logs directory {}: {}", logs_path.display(), e); 18 } 19 20 let file_appender = rolling::daily(logs_path, concat!(env!("CARGO_PKG_NAME"), ".log")); 21 let (file_writer, guard) = tracing_appender::non_blocking(file_appender); 22 23 let stdout_layer = fmt::layer().with_writer(std::io::stdout).with_target(false); 24 25 let file_layer = fmt::layer() 26 .with_writer(file_writer) 27 .with_ansi(false) 28 .with_target(false); 29 30 let subscriber = Registry::default() 31 .with(EnvFilter::from_default_env()) 32 .with(stdout_layer) 33 .with(file_layer); 34 35 #[cfg(feature = "audit")] 36 let (subscriber, audit_guard) = { 37 let audit_app = rolling::daily(logs_path, "audit.log"); 38 let (audit_writer, guard) = tracing_appender::non_blocking(audit_app); 39 40 let audit_layer = fmt::layer() 41 .with_writer(audit_writer) 42 .with_ansi(false) 43 .with_target(true) 44 .with_filter(Targets::new().with_target("audit", tracing::Level::INFO)); 45 46 (subscriber.with(audit_layer), Some(guard)) 47 }; 48 49 #[cfg(not(feature = "audit"))] 50 let (subscriber, audit_guard) = (subscriber, None); 51 52 subscriber.init(); 53 TelemetryGuards { 54 _file: guard, 55 _audit: audit_guard, 56 } 57 }