Implement allocation-free logging

This commit is contained in:
Yuke Peng
2024-09-23 17:33:57 +08:00
committed by Tate, Hongliang Tian
parent cbe85a1878
commit 14531cd99f

View File

@ -10,14 +10,11 @@
//! //!
//! IRQs are disabled while printing. So do not print long log messages. //! IRQs are disabled while printing. So do not print long log messages.
use alloc::format;
use log::{LevelFilter, Metadata, Record}; use log::{LevelFilter, Metadata, Record};
use crate::{ use crate::{
arch::timer::Jiffies, arch::timer::Jiffies,
boot::{kcmdline::ModuleArg, kernel_cmdline}, boot::{kcmdline::ModuleArg, kernel_cmdline},
early_println,
}; };
const LOGGER: Logger = Logger {}; const LOGGER: Logger = Logger {};
@ -34,34 +31,43 @@ impl log::Log for Logger {
return; return;
} }
let timestamp = format!("[{:>10.3}]", Jiffies::elapsed().as_duration().as_secs_f64()); let timestamp = Jiffies::elapsed().as_duration().as_secs_f64();
let level = format!("{:<5}", record.level()); let level = record.level();
let record_str = format!("{}", record.args());
#[cfg(feature = "log_color")]
let (timestamp, level, record_str) = {
use alloc::string::ToString;
use owo_colors::OwoColorize;
let timestamp = timestamp.green();
let level = match record.level() {
log::Level::Error => level.red().to_string(),
log::Level::Warn => level.bright_yellow().to_string(),
log::Level::Info => level.blue().to_string(),
log::Level::Debug => level.bright_green().to_string(),
log::Level::Trace => level.bright_black().to_string(),
};
let record_str = record_str.default_color();
(timestamp, level, record_str)
};
// Use a global lock to prevent interleaving of log messages. // Use a global lock to prevent interleaving of log messages.
use crate::sync::SpinLock; use crate::sync::SpinLock;
static RECORD_LOCK: SpinLock<()> = SpinLock::new(()); static RECORD_LOCK: SpinLock<()> = SpinLock::new(());
let _lock = RECORD_LOCK.disable_irq().lock(); let _lock = RECORD_LOCK.disable_irq().lock();
early_println!("{} {}: {}", timestamp, level, record_str); cfg_if::cfg_if! {
if #[cfg(feature = "log_color")]{
use owo_colors::Style;
let timestamp_style = Style::new().green();
let record_style = Style::new().default_color();
let level_style = match record.level() {
log::Level::Error => Style::new().red(),
log::Level::Warn => Style::new().bright_yellow(),
log::Level::Info => Style::new().blue(),
log::Level::Debug => Style::new().bright_green(),
log::Level::Trace => Style::new().bright_black(),
};
crate::console::early_print(
format_args!("{} {:<5}: {}\n",
timestamp_style.style(format_args!("[{:>10.3}]", timestamp)),
level_style.style(level),
record_style.style(record.args()))
);
}else{
crate::console::early_print(
format_args!("{} {:<5}: {}\n",
format_args!("[{:>10.3}]", timestamp),
level,
record.args())
);
}
}
} }
fn flush(&self) {} fn flush(&self) {}