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 2ebb2a572..f2834afa7 100644 --- a/os/src/main.rs +++ b/os/src/main.rs @@ -29,6 +29,8 @@ extern crate alloc; #[macro_use] extern crate bitflags; +use log::*; + #[path = "boards/qemu.rs"] mod board; @@ -37,6 +39,7 @@ mod console; mod config; mod lang_items; mod loader; +mod logging; pub mod mm; mod sbi; pub mod sync; @@ -65,7 +68,8 @@ fn clear_bss() { /// the rust entry-point of os pub fn rust_main() -> ! { clear_bss(); - println!("[kernel] Hello, world!"); + logging::init(); + info!("[kernel] Hello, world!"); mm::init(); mm::remap_test(); task::add_initproc();