diff --git a/spdlog/src/lib.rs b/spdlog/src/lib.rs index d27745ef..0d8e9879 100644 --- a/spdlog/src/lib.rs +++ b/spdlog/src/lib.rs @@ -310,10 +310,10 @@ pub const __EOL: &str = "\n"; #[doc(hidden)] pub const __EOL: &str = "\r\n"; -static DEFAULT_LOGGER: OnceCell> = OnceCell::new(); +static DEFAULT_LOGGER: OnceCell> = OnceCell::new(); #[must_use] -fn default_logger_ref() -> &'static ArcSwap { +fn default_logger_ref() -> &'static ArcSwapOption { DEFAULT_LOGGER.get_or_init(|| { let stdout = StdStreamSink::builder() .std_stream(StdStream::Stdout) @@ -329,7 +329,8 @@ fn default_logger_ref() -> &'static ArcSwap { let sinks: [Arc; 2] = [Arc::new(stdout), Arc::new(stderr)]; - let res = ArcSwap::from_pointee(Logger::builder().sinks(sinks).build_default().unwrap()); + let res = + ArcSwapOption::from_pointee(Logger::builder().sinks(sinks).build_default().unwrap()); flush_default_logger_at_exit(); res @@ -381,7 +382,7 @@ fn default_logger_ref() -> &'static ArcSwap { /// ``` #[must_use] pub fn default_logger() -> Arc { - default_logger_ref().load().clone() + default_logger_ref().load().clone().unwrap() } /// Sets the given logger as the default logger, and returns the old default @@ -400,7 +401,7 @@ pub fn default_logger() -> Arc { /// info!(logger: old_logger, "this log will be handled by `old_logger`"); /// ``` pub fn swap_default_logger(logger: Arc) -> Arc { - default_logger_ref().swap(logger) + default_logger_ref().swap(Some(logger)).unwrap() } /// Sets the given logger as the default logger. @@ -658,7 +659,10 @@ fn flush_default_logger_at_exit() { extern "C" fn handler() { IS_TEARING_DOWN.store(true, Ordering::SeqCst); if let Some(default_logger) = DEFAULT_LOGGER.get() { - default_logger.load().flush() + // Swap with `None` so it will be dropped at the end of this function + if let Some(default_logger) = default_logger.swap(None) { + default_logger.flush(); + } } }