From 2c4097b1e334b07721e01eaa08acd878f72744c3 Mon Sep 17 00:00:00 2001 From: Sergey Timoshin Date: Mon, 21 Jul 2025 14:53:29 +0100 Subject: [PATCH] feat: add log rotation for forester Added log rotation with 48-hour retention (2 days) and fallback to stdout logging when file appender creation fails. --- forester/src/telemetry.rs | 54 +++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/forester/src/telemetry.rs b/forester/src/telemetry.rs index a32af11dbf..6845fca9cc 100644 --- a/forester/src/telemetry.rs +++ b/forester/src/telemetry.rs @@ -8,34 +8,54 @@ static INIT: Once = Once::new(); pub fn setup_telemetry() { INIT.call_once(|| { - let file_appender = RollingFileAppender::new(Rotation::HOURLY, "logs", "forester.log"); - let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender); + let file_appender = match RollingFileAppender::builder() + .rotation(Rotation::HOURLY) + .filename_prefix("forester") + .filename_suffix("log") + .max_log_files(48) // 2 days + .build("logs") + { + Ok(appender) => Some(appender), + Err(e) => { + eprintln!( + "Warning: Failed to create log file appender: {}. Logging to stdout only.", + e + ); + None + } + }; - let env_filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("info,forester=debug")); - - let file_env_filter = EnvFilter::new("info,forester=debug"); + let env_filter = + EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); let stdout_env_filter = - EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("debug")); + EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); let stdout_layer = fmt::Layer::new() .with_writer(std::io::stdout) .with_ansi(true) .with_filter(stdout_env_filter); - let file_layer = fmt::Layer::new() - .with_writer(non_blocking) - .with_filter(file_env_filter); + if let Some(file_appender) = file_appender { + let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender); + let file_env_filter = EnvFilter::new("info"); + let file_layer = fmt::Layer::new() + .with_writer(non_blocking) + .with_filter(file_env_filter); - tracing_subscriber::registry() - .with(stdout_layer) - .with(file_layer) - .with(env_filter) - .init(); + tracing_subscriber::registry() + .with(stdout_layer) + .with(file_layer) + .with(env_filter) + .init(); - // Keep _guard in scope to keep the non-blocking writer alive - std::mem::forget(_guard); + std::mem::forget(_guard); + } else { + tracing_subscriber::registry() + .with(stdout_layer) + .with(env_filter) + .init(); + } }); }