@@ -90,6 +90,15 @@ pub struct Logger {
9090
9191 /// Maximum log level that will be processed. Messages below this level are ignored.
9292 max_level : log:: LevelFilter ,
93+
94+ /// Flag to indicate if the logger is still running.
95+ running : Arc < AtomicBool > ,
96+ }
97+
98+ impl Drop for Logger {
99+ fn drop ( & mut self ) {
100+ self . running . store ( false , Ordering :: Relaxed ) ;
101+ }
93102}
94103
95104impl Logger {
@@ -122,8 +131,16 @@ impl Logger {
122131 /// // Only log INFO and above (INFO, WARN, ERROR)
123132 /// let logger = Logger::new(channel, LevelFilter::Info);
124133 /// ```
125- pub ( crate ) fn new ( chan : Arc < Channel > , max_level : log:: LevelFilter ) -> Self {
126- Self { chan, max_level }
134+ pub ( crate ) fn new (
135+ chan : Arc < Channel > ,
136+ max_level : log:: LevelFilter ,
137+ running : Arc < AtomicBool > ,
138+ ) -> Self {
139+ Self {
140+ chan,
141+ max_level,
142+ running,
143+ }
127144 }
128145}
129146
@@ -273,7 +290,9 @@ impl log::Log for Logger {
273290 s. write_str ( "\n " ) . ok ( ) ;
274291
275292 // Send to consumer thread (transfers ownership)
276- self . chan . push ( s) ;
293+ if self . running . load ( Ordering :: Relaxed ) {
294+ self . chan . push ( s) ;
295+ }
277296 }
278297
279298 /// Flushes any buffered log records.
@@ -492,7 +511,8 @@ mod tests {
492511 // Create ring buffer and logger
493512 let parker = Parker :: new ( ) ;
494513 let chan = Arc :: new ( Channel :: new ( 4 , parker. unparker ( ) . to_owned ( ) ) ) ;
495- let logger = Logger :: new ( chan. clone ( ) , log:: LevelFilter :: Info ) ;
514+ let running = Arc :: new ( AtomicBool :: new ( true ) ) ;
515+ let logger = Logger :: new ( chan. clone ( ) , log:: LevelFilter :: Info , running) ;
496516 let running = Arc :: new ( AtomicBool :: new ( true ) ) ;
497517
498518 // Create appender with a Vec as writer (for testing)
0 commit comments