diff --git a/logger_core/src/lib.rs b/logger_core/src/lib.rs index 0bc76a9e91..6145b7d53f 100644 --- a/logger_core/src/lib.rs +++ b/logger_core/src/lib.rs @@ -2,9 +2,12 @@ * Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 */ use once_cell::sync::OnceCell; -use std::sync::RwLock; +use std::{ + path::{Path, PathBuf}, + sync::RwLock, +}; use tracing::{self, event}; -use tracing_appender::rolling::{RollingFileAppender, Rotation}; +use tracing_appender::rolling::{RollingFileAppender, RollingWriter, Rotation}; use tracing_subscriber::{ filter::Filtered, fmt::{ @@ -28,7 +31,7 @@ type InnerLayered = Layered, Registry>; // A reloadable layer of subscriber to a rolling file type FileReload = Handle< Filtered< - Layer, + Layer, LevelFilter, InnerLayered, >, @@ -48,6 +51,42 @@ pub static INITIATE_ONCE: InitiateOnce = InitiateOnce { init_once: OnceCell::new(), }; +struct LazyRollingFileAppender { + file_appender: OnceCell, + rotation: Rotation, + directory: PathBuf, + filename_prefix: PathBuf, +} + +impl LazyRollingFileAppender { + fn new( + rotation: Rotation, + directory: impl AsRef, + filename_prefix: impl AsRef, + ) -> LazyRollingFileAppender { + LazyRollingFileAppender { + file_appender: OnceCell::new(), + rotation, + directory: directory.as_ref().to_path_buf(), + filename_prefix: filename_prefix.as_ref().to_path_buf(), + } + } +} + +impl<'a> tracing_subscriber::fmt::writer::MakeWriter<'a> for LazyRollingFileAppender { + type Writer = RollingWriter<'a>; + fn make_writer(&'a self) -> Self::Writer { + let file_appender = self.file_appender.get_or_init(|| { + RollingFileAppender::new( + self.rotation.clone(), + self.directory.clone(), + self.filename_prefix.clone(), + ) + }); + file_appender.make_writer() + } +} + #[derive(Debug)] pub enum Level { Error = 0, @@ -84,7 +123,7 @@ pub fn init(minimal_level: Option, file_name: Option<&str>) -> Level { let (stdout_layer, stdout_reload) = reload::Layer::new(stdout_fmt); - let file_appender = RollingFileAppender::new( + let file_appender = LazyRollingFileAppender::new( Rotation::HOURLY, "glide-logs", file_name.unwrap_or("output.log"), @@ -130,7 +169,7 @@ pub fn init(minimal_level: Option, file_name: Option<&str>) -> Level { }); } Some(file) => { - let file_appender = RollingFileAppender::new(Rotation::HOURLY, "glide-logs", file); + let file_appender = LazyRollingFileAppender::new(Rotation::HOURLY, "glide-logs", file); let _ = reloads .file_reload .write()