Skip to content

Commit 1a2c6ad

Browse files
Jonathan Woollett-LightJonathanWoollett-Light
Jonathan Woollett-Light
authored andcommitted
feat: Simplify error logging
Simplifies errors to always log their `Display` implementation and always write their `Debug` implementation to `stderr`, this also simplifies general logging procedure when a log target has not been initialized, now all logs are written to `stdout`. Previously `error` and `warn` level logs where written to `stderr` while `info`, `debug` and `trace` level logs where written to `stdout`. Signed-off-by: Jonathan Woollett-Light <[email protected]>
1 parent d4c26a9 commit 1a2c6ad

File tree

2 files changed

+13
-15
lines changed

2 files changed

+13
-15
lines changed

src/firecracker/src/main.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,10 @@ impl From<MainError> for ExitCode {
7777

7878
fn main() -> ExitCode {
7979
let result = main_exec();
80-
if let Err(e) = result {
81-
error!("{}", e);
82-
e.into()
80+
if let Err(err) = result {
81+
error!("{err}");
82+
eprintln!("Error: {err:?}");
83+
ExitCode::from(err)
8384
} else {
8485
ExitCode::SUCCESS
8586
}

src/logger/src/logger.rs

+9-12
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@
7777
//! etc).
7878
7979
use std::fmt::{self, Debug};
80-
use std::io::{sink, stderr, stdout, Write};
80+
use std::io::{sink, stdout, Write};
8181
use std::sync::atomic::{AtomicBool, Ordering};
8282
use std::sync::{Mutex, RwLock};
8383
use std::{result, thread};
8484

8585
use lazy_static::lazy_static;
86-
use log::{max_level, set_logger, set_max_level, Level, LevelFilter, Log, Metadata, Record};
86+
use log::{max_level, set_logger, set_max_level, LevelFilter, Log, Metadata, Record};
8787
use utils::time::LocalTime;
8888

8989
use super::extract_guard;
@@ -371,30 +371,27 @@ impl Logger {
371371
})
372372
.map_err(LoggerError::Init)?;
373373

374-
self.write_log(header, Level::Info);
374+
self.write_log(&header);
375375

376376
Ok(())
377377
}
378378

379379
/// Handles the common logic of writing regular log messages.
380380
///
381381
/// Writes `msg` followed by a newline to the destination, flushing afterwards.
382-
fn write_log(&self, msg: String, msg_level: Level) {
382+
fn write_log(&self, msg: &str) {
383383
let mut guard;
384384
let mut writer: Box<dyn Write> = if self.init.is_initialized() {
385385
guard = extract_guard(self.log_buf.lock());
386386
Box::new(guard.as_mut())
387387
} else {
388-
match msg_level {
389-
Level::Error | Level::Warn => Box::new(stderr()),
390-
_ => Box::new(stdout()),
391-
}
388+
Box::new(stdout())
392389
};
393390
// Writes `msg` followed by newline and flushes, if either operation returns an error,
394391
// increment missed log count.
395392
// This approach is preferable over `Result::and` as if `write!` returns an error it then
396393
// does not attempt to flush.
397-
if writeln!(writer, "{}", msg)
394+
if writeln!(writer, "{msg}")
398395
.and_then(|_| writer.flush())
399396
.is_err()
400397
{
@@ -426,7 +423,7 @@ impl Log for Logger {
426423
self.create_prefix(record),
427424
record.args()
428425
);
429-
self.write_log(msg, record.metadata().level());
426+
self.write_log(&msg);
430427
}
431428

432429
// This is currently not used.
@@ -441,7 +438,7 @@ mod tests {
441438
use std::io::{BufWriter, Read, Write};
442439
use std::sync::Arc;
443440

444-
use log::info;
441+
use log::{info, Level};
445442

446443
use super::*;
447444

@@ -565,7 +562,7 @@ mod tests {
565562
let logger = Logger::new();
566563
logger.init(String::from(TEST_HEADER), writer).unwrap();
567564
// Log some generic data
568-
logger.write_log(String::from(TEST_STR), Level::Info);
565+
logger.write_log(TEST_STR);
569566
// To drop the logger without calling its destructor, or to `forget` it
570567
// (https://doc.rust-lang.org/stable/std/mem/fn.forget.html) will lead
571568
// to a memory leak, so for this test I do not do this.

0 commit comments

Comments
 (0)