ch1-exp: Log and color output

This commit is contained in:
Tateisi 2025-08-02 21:24:14 +08:00
parent 3681c27870
commit a5140c2cba
4 changed files with 59 additions and 3 deletions

7
Cargo.lock generated
View file

@ -2,10 +2,17 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "log"
version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]] [[package]]
name = "os" name = "os"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"log",
"sbi-rt", "sbi-rt",
] ]

View file

@ -4,4 +4,5 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
log = "0.4.22"
sbi-rt = "0.0.3" sbi-rt = "0.0.3"

42
src/logger.rs Normal file
View file

@ -0,0 +1,42 @@
use log::{Level, LevelFilter, Log};
use crate::println;
struct Logger;
impl Log for Logger {
fn enabled(&self, _metadata: &log::Metadata) -> bool {
true
}
fn log(&self, record: &log::Record) {
if !self.enabled(record.metadata()) {
return;
}
let (color, level) = match record.level() {
Level::Error => (31, "ERR"),
Level::Warn => (93, "WRN"),
Level::Info => (34, "INF"),
Level::Debug => (32, "DBG"),
Level::Trace => (90, "TRC"),
};
println!("\x1b[{}m{}\x1b[0m \x1b[1m{}\x1b[0m {}", color, level, record.target(), record.args());
}
fn flush(&self) {}
}
pub fn init() {
static LOGGER: Logger = Logger;
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::Off,
});
}

View file

@ -3,24 +3,30 @@
mod lang_items; mod lang_items;
mod sbi; mod sbi;
mod logger;
#[macro_use] #[macro_use]
mod console; mod console;
use core::arch::global_asm; use core::arch::global_asm;
use log::{debug, error, info, trace, warn};
global_asm!(include_str!("entry.asm")); global_asm!(include_str!("entry.asm"));
#[no_mangle] #[no_mangle]
pub fn rust_main() -> ! { pub fn rust_main() -> ! {
clear_bss(); clear_bss();
logger::init();
sbi::console_write_byte('O' as u8); sbi::console_write_byte('O' as u8);
sbi::console_write_byte('K' as u8); sbi::console_write_byte('K' as u8);
sbi::console_write_byte('\n' as u8); sbi::console_write_byte('\n' as u8);
sbi::console_write("Hello World.\n".as_bytes()); trace!("Hello World.");
debug!("Hello World.");
println!("hello world from macro"); info!("Hello World.");
warn!("Hello World.");
error!("Hello World.");
panic!("Shutdown machine!"); panic!("Shutdown machine!");
} }