1
0
Fork 0
forked from koniifer/ableos
ableos-framebuffer/ableos/src/logger.rs

66 lines
2.2 KiB
Rust
Raw Normal View History

2022-03-26 06:35:33 -05:00
use crate::kmain::KERNEL_CONF;
use crate::network::socket::{SimpleSock, Socket};
2022-03-11 17:13:41 -06:00
use crate::time::fetch_time;
2022-01-16 19:42:11 -06:00
use lliw::{Fg, Reset};
use log::{Level, Metadata, Record};
2022-04-11 17:23:11 -05:00
use log::{LevelFilter, SetLoggerError};
2022-01-16 19:42:11 -06:00
2022-04-11 17:23:11 -05:00
static LOGGER: SimpleLogger = SimpleLogger;
2022-02-07 07:33:40 -06:00
// TODO: Rebuild this to take advantage of sockets
// DETAIL: Log to a socket instead of the screen
2022-04-11 17:23:11 -05:00
// So that we can log in the kernel and display it in userland
struct SimpleLogger;
2022-01-16 19:42:11 -06:00
impl log::Log for SimpleLogger {
fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= Level::Trace
}
fn log(&self, record: &Record) {
if self.enabled(record.metadata()) {
2022-03-11 17:13:41 -06:00
let time_float = fetch_time();
2022-01-16 19:42:11 -06:00
let color = match record.level() {
log::Level::Error => (Fg::Red, "$RED$"),
log::Level::Warn => (Fg::LightYellow, "$LIGHTYELLOW$"),
log::Level::Info => (Fg::LightWhite, "$LIGHTGRAY$"),
log::Level::Debug => (Fg::Blue, "$BLUE$"),
log::Level::Trace => (Fg::Yellow, "$YELLOW$"),
};
let msg = format!(
"[{}{}$RESET$][$GREEN${}$RESET$]{}\n",
color.1,
record.level(),
time_float,
record.args()
);
2022-03-11 15:14:35 -06:00
// kprint!("{}", msg);
2022-03-26 06:35:33 -05:00
if KERNEL_CONF.logging.log_to_serial {
serial_println!(
"[{}{}{}][{}{}{}] {}",
color.0,
record.level(),
Fg::Reset,
Fg::Green,
time_float,
Reset,
record.args()
);
}
let log_socket_id = SimpleSock::grab_socket("Logger".to_string());
match log_socket_id {
Some(mut log_socket_id) => {
log_socket_id.write(msg.as_bytes().to_vec());
}
None => warn!("No socket found for Logger"),
}
2022-01-16 19:42:11 -06:00
}
}
/// Clear the log buffer
2022-01-16 19:42:11 -06:00
fn flush(&self) {}
}
pub fn init() -> Result<(), SetLoggerError> {
log::set_logger(&LOGGER).map(|()| log::set_max_level(LevelFilter::Trace))
}