Skip to main content

strat9_kernel/boot/
logger.rs

1use log::{Level, LevelFilter, Metadata, Record};
2
3/// Simple serial port logger
4struct SerialLogger;
5
6static LOGGER: SerialLogger = SerialLogger;
7
8impl log::Log for SerialLogger {
9    /// Performs the enabled operation.
10    fn enabled(&self, metadata: &Metadata) -> bool {
11        metadata.level() <= Level::Trace
12    }
13
14    /// Performs the log operation.
15    fn log(&self, record: &Record) {
16        if self.enabled(record.metadata()) {
17            let (level_str, msg_color) = match record.level() {
18                Level::Error => ("\x1b[31mERROR\x1b[0m", "\x1b[31m"),
19                Level::Warn => ("\x1b[33mWARN\x1b[0m", "\x1b[33m"),
20                Level::Info => ("\x1b[32mINFO\x1b[0m", "\x1b[37m"),
21                Level::Debug => ("\x1b[90mDEBUG\x1b[0m", "\x1b[90m"),
22                Level::Trace => ("\x1b[90mTRACE\x1b[0m", "\x1b[90m"),
23            };
24
25            crate::arch::x86_64::serial::_print(format_args!(
26                "[{}] {}{}\x1b[0m\n",
27                level_str,
28                msg_color,
29                record.args()
30            ));
31        }
32    }
33
34    /// Performs the flush operation.
35    fn flush(&self) {}
36}
37
38/// Initialize the logger
39pub fn init() {
40    log::set_logger(&LOGGER)
41        .map(|()| log::set_max_level(LevelFilter::Trace))
42        .expect("Failed to set logger");
43}