From 81f9e8bf962ea0aba1a0ee36e7a4e15652dff91c Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Mon, 10 Feb 2025 00:29:05 +0800 Subject: [PATCH] logging: bugfix #137: Init log module to enable logging macros --- os/src/logging.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ os/src/main.rs | 12 ++++++++---- 2 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 os/src/logging.rs diff --git a/os/src/logging.rs b/os/src/logging.rs new file mode 100644 index 000000000..b5421f140 --- /dev/null +++ b/os/src/logging.rs @@ -0,0 +1,47 @@ +/*! + +本模块利用 log crate 为你提供了日志功能,使用方式见 main.rs. + +*/ + +use log::{self, Level, LevelFilter, Log, Metadata, Record}; + +struct SimpleLogger; + +impl Log for SimpleLogger { + fn enabled(&self, _metadata: &Metadata) -> bool { + true + } + fn log(&self, record: &Record) { + if !self.enabled(record.metadata()) { + return; + } + let color = match record.level() { + Level::Error => 31, // Red + Level::Warn => 93, // BrightYellow + Level::Info => 34, // Blue + Level::Debug => 32, // Green + Level::Trace => 90, // BrightBlack + }; + println!( + "\u{1B}[{}m[{:>5}] {}\u{1B}[0m", + color, + record.level(), + record.args(), + ); + } + fn flush(&self) {} +} + +pub fn init() { + static LOGGER: SimpleLogger = SimpleLogger; + log::set_logger(&LOGGER).unwrap(); + log::set_max_level(match option_env!("LOG") { + Some("ERROR") => LevelFilter::Error, + Some("WARN") => LevelFilter::Warn, + Some("INFO") => LevelFilter::Info, + Some("DEBUG") => LevelFilter::Debug, + Some("TRACE") => LevelFilter::Trace, + _ => LevelFilter::Info, + }); +} diff --git a/os/src/main.rs b/os/src/main.rs index 276aaf52b..690e40c0d 100644 --- a/os/src/main.rs +++ b/os/src/main.rs @@ -10,6 +10,8 @@ extern crate alloc; #[macro_use] extern crate bitflags; +use log::*; + #[path = "boards/qemu.rs"] mod board; @@ -19,6 +21,7 @@ mod config; mod drivers; mod fs; mod lang_items; +mod logging; mod mm; mod net; mod sbi; @@ -55,15 +58,16 @@ lazy_static! { #[no_mangle] pub fn rust_main() -> ! { clear_bss(); + logging::init(); mm::init(); UART.init(); - println!("KERN: init gpu"); + info!("KERN: init gpu"); let _gpu = GPU_DEVICE.clone(); - println!("KERN: init keyboard"); + info!("KERN: init keyboard"); let _keyboard = KEYBOARD_DEVICE.clone(); - println!("KERN: init mouse"); + info!("KERN: init mouse"); let _mouse = MOUSE_DEVICE.clone(); - println!("KERN: init trap"); + info!("KERN: init trap"); trap::init(); trap::enable_timer_interrupt(); timer::set_next_trigger();