Skip to content

Commit 7577f3a

Browse files
authored
Merge pull request #1796 from hermit-os/logger-format
feat(logging): print time and target
2 parents 2458a06 + c9799e2 commit 7577f3a

File tree

5 files changed

+60
-9
lines changed

5 files changed

+60
-9
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ fsgsbase = []
5555
fuse = ["pci", "dep:fuse-abi", "fuse-abi/num_enum"]
5656
gem-net = ["tcp", "dep:tock-registers"]
5757
idle-poll = []
58+
log-target = []
5859
mmap = []
5960
newlib = []
6061
nostd = []

src/arch/aarch64/kernel/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ pub fn boot_processor_init() {
151151
env::init();
152152
interrupts::init();
153153
processor::detect_frequency();
154+
crate::logging::KERNEL_LOGGER.set_time(true);
154155
processor::print_information();
155156
systemtime::init();
156157
#[cfg(feature = "pci")]

src/arch/riscv64/kernel/start.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ unsafe extern "C" fn pre_init(hart_id: usize, boot_info: Option<&'static RawBoot
5050
CURRENT_BOOT_ID.store(hart_id as u32, Ordering::Relaxed);
5151

5252
if CPU_ONLINE.load(Ordering::Acquire) == 0 {
53+
crate::logging::KERNEL_LOGGER.set_time(true);
54+
5355
env::set_boot_info(*boot_info.unwrap());
5456
let fdt = unsafe { Fdt::from_ptr(get_dtb_ptr()).expect("FDT is invalid") };
5557
// Init HART_MASK

src/arch/x86_64/kernel/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ pub fn boot_processor_init() {
154154
crate::mm::print_information();
155155
CoreLocal::get().add_irq_counter();
156156
env::init();
157+
crate::logging::KERNEL_LOGGER.set_time(true);
157158
gdt::add_current_core();
158159
interrupts::load_idt();
159160
pic::init();

src/logging.rs

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,31 @@
11
use core::fmt;
2+
use core::sync::atomic::{AtomicBool, Ordering};
23

34
use anstyle::AnsiColor;
45
use log::{Level, LevelFilter, Metadata, Record};
56

7+
pub static KERNEL_LOGGER: KernelLogger = KernelLogger::new();
8+
69
/// Data structure to filter kernel messages
7-
struct KernelLogger;
10+
pub struct KernelLogger {
11+
time: AtomicBool,
12+
}
13+
14+
impl KernelLogger {
15+
pub const fn new() -> Self {
16+
Self {
17+
time: AtomicBool::new(false),
18+
}
19+
}
20+
21+
pub fn time(&self) -> bool {
22+
self.time.load(Ordering::Relaxed)
23+
}
24+
25+
pub fn set_time(&self, time: bool) {
26+
self.time.store(time, Ordering::Relaxed);
27+
}
28+
}
829

930
impl log::Log for KernelLogger {
1031
fn enabled(&self, _: &Metadata<'_>) -> bool {
@@ -16,14 +37,39 @@ impl log::Log for KernelLogger {
1637
}
1738

1839
fn log(&self, record: &Record<'_>) {
19-
if self.enabled(record.metadata()) {
20-
println!(
21-
"[{}][{}] {}",
22-
crate::arch::core_local::core_id(),
23-
ColorLevel(record.level()),
24-
record.args()
25-
);
40+
if !self.enabled(record.metadata()) {
41+
return;
2642
}
43+
44+
// FIXME: Use `super let` once stable
45+
let time;
46+
let format_time = if self.time() {
47+
time = Microseconds(crate::processor::get_timer_ticks());
48+
format_args!("[{time}]")
49+
} else {
50+
format_args!("[ ]")
51+
};
52+
let core_id = crate::arch::core_local::core_id();
53+
let level = ColorLevel(record.level());
54+
// FIXME: Use `super let` once stable
55+
let target = record.target();
56+
let format_target = if cfg!(feature = "log-target") {
57+
format_args!(" {target}")
58+
} else {
59+
format_args!("")
60+
};
61+
let args = record.args();
62+
println!("{format_time}[{core_id}][{level}{format_target}] {args}");
63+
}
64+
}
65+
66+
struct Microseconds(u64);
67+
68+
impl fmt::Display for Microseconds {
69+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
70+
let seconds = self.0 / 1_000_000;
71+
let microseconds = self.0 % 1_000_000;
72+
write!(f, "{seconds:5}.{microseconds:06}")
2773
}
2874
}
2975

@@ -55,7 +101,7 @@ fn no_color() -> bool {
55101
}
56102

57103
pub unsafe fn init() {
58-
log::set_logger(&KernelLogger).expect("Can't initialize logger");
104+
log::set_logger(&KERNEL_LOGGER).expect("Can't initialize logger");
59105
// Determines LevelFilter at compile time
60106
let log_level: Option<&'static str> = option_env!("HERMIT_LOG_LEVEL_FILTER");
61107
let mut max_level = LevelFilter::Info;

0 commit comments

Comments
 (0)