diff --git a/core/sysmaster/src/manager/mod.rs b/core/sysmaster/src/manager/mod.rs index f1062e317d4ab2496900f0479a9d7eec378be38c..46228b77e99ac4e39b7f7c93247afae9b3df59ec 100644 --- a/core/sysmaster/src/manager/mod.rs +++ b/core/sysmaster/src/manager/mod.rs @@ -460,6 +460,7 @@ impl Manager { } log::info!("Rebooting..."); + log::flush!(); let _ = reboot::reboot(reboot_mode); // make lint happy } diff --git a/libs/log/src/inner.rs b/libs/log/src/inner.rs index 13f42aed8e2aac8c92cd5dc5ad504bba1cf7531d..f13c51ed3dcd7cefd78ac95bdca859017aeba518 100644 --- a/libs/log/src/inner.rs +++ b/libs/log/src/inner.rs @@ -194,6 +194,14 @@ macro_rules! trace { ) } +/// flush output stream +#[macro_export(local_inner_macros)] +macro_rules! flush { + () => { + $crate::inner::__private_api_flush(); + }; +} + /// /* Private, shouldn't be used out of this file. */ pub fn __private_api_log( @@ -222,6 +230,20 @@ pub fn __private_api_log( } } +/// +pub fn __private_api_flush() { + if STATE.load(Ordering::SeqCst) != INITIALIZED { + return; + } + let logger = unsafe { &LOGGER_LOCK }; + match logger { + Some(v) => { + v.read().unwrap().flush(); + } + None => {} + } +} + pub use crate::debug; pub use crate::error; pub use crate::info; diff --git a/libs/log/src/logger.rs b/libs/log/src/logger.rs index 11d8d224a744eec19a80520e73e1df7daf422db3..15f8b118cb88c076499a1b8cf6622929c08f178f 100644 --- a/libs/log/src/logger.rs +++ b/libs/log/src/logger.rs @@ -340,6 +340,9 @@ impl log::Log for FileLogger { if let Err(e) = file.flush() { println!("Failed to flush log file: {}", e); } + if let Err(e) = file.sync_all() { + println!("Failed to sync all log file: {}", e); + } } None => { if !get_open_when_needed() { @@ -605,7 +608,11 @@ impl Log for CombinedLogger { } } - fn flush(&self) {} + fn flush(&self) { + for log in &self.loggers { + log.flush(); + } + } } impl CombinedLogger {