Skip to content

Commit 5282a6a

Browse files
committed
feat(logging): align log envvars with the log crate
1 parent d2c8ea2 commit 5282a6a

5 files changed

Lines changed: 34 additions & 25 deletions

File tree

README.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,16 @@ If you want to build the kernel for riscv64, please use `riscv64`.
3838
### Control the kernel messages verbosity
3939

4040
This kernel uses the lightweight logging crate [log](https://github.com/rust-lang/log) to print kernel messages. The
41-
environment variable `HERMIT_LOG_LEVEL_FILTER` controls the verbosity and follows [the env_logger
42-
format](https://docs.rs/env_logger/latest/env_logger/) but without the regex support. You can change it per module by
43-
setting it at compile time to a string in the format `[target][=level][,...]`, where the level is a string matching the
44-
name of a [LevelFilter](https://docs.rs/log/0.4.8/log/enum.LevelFilter.html). If the target is omitted, the level is set
45-
as the global level. If the level is omitted, logs of all levels are printed for the target.
41+
compile time environment variable `HERMIT_LOG_DEFAULT` and the runtime environment variable `HERMIT_LOG` control the
42+
verbosity and follow [the env_logger format](https://docs.rs/env_logger/latest/env_logger/) but without the regex
43+
support.
4644

47-
If the variable is not set, or it does not provide a global level, then `LevelFilter::Info` is used as the global level
45+
The logging level can be changed per module by setting it to a string in the format `[target][=level][,...]`, where the
46+
level is a string matching the name of a [LevelFilter](https://docs.rs/log/0.4.8/log/enum.LevelFilter.html). If the
47+
target is omitted, the level is set as the global level. If the level is omitted, logs of all levels are printed for the
48+
target.
49+
50+
If the variables are not set, or they do not provide a global level, then `LevelFilter::Info` is used as the global level
4851
by default.
4952

5053
```sh

src/arch/aarch64/kernel/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ pub fn boot_processor_init() {
9090
crate::mm::init();
9191
crate::mm::print_information();
9292
CoreLocal::get().add_irq_counter();
93-
env::init();
9493
interrupts::init();
9594
processor::detect_frequency();
9695
crate::logging::KERNEL_LOGGER.set_time(true);

src/arch/riscv64/kernel/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ pub fn boot_processor_init() {
108108
devicetree::init();
109109
crate::mm::init();
110110
crate::mm::print_information();
111-
env::init();
112111
interrupts::install();
113112

114113
finish_processor_init();

src/arch/x86_64/kernel/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ pub fn boot_processor_init() {
104104
crate::mm::init();
105105
crate::mm::print_information();
106106
CoreLocal::get().add_irq_counter();
107-
env::init();
108107
gdt::add_current_core();
109108
interrupts::load_idt();
110109
pic::init();

src/logging.rs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use anstyle::AnsiColor;
66
use hermit_sync::OnceCell;
77
use log::{Level, LevelFilter, Metadata, Record};
88

9+
use crate::env;
10+
911
pub static KERNEL_LOGGER: KernelLogger = KernelLogger::new();
1012
const ARENA_SIZE: usize = 4096;
1113
static mut ARENA: [u8; ARENA_SIZE] = [0; _];
@@ -115,31 +117,38 @@ fn no_color() -> bool {
115117
}
116118

117119
pub unsafe fn init() {
120+
log::set_logger(&KERNEL_LOGGER).expect("Can't initialize logger");
121+
// To get logs until we determine the actual log level
122+
log::set_max_level(LevelFilter::Info);
123+
118124
#[cfg(target_os = "none")]
119125
unsafe {
120126
crate::mm::ALLOCATOR
121127
.lock()
122128
.claim((&raw mut ARENA).cast(), ARENA_SIZE)
123129
.unwrap()
124130
};
131+
env::init();
132+
133+
let mut filter_builder = env_filter::Builder::new();
134+
// The default. It may get overwritten by the parsed filter if it has a global level.
135+
filter_builder.filter_level(LevelFilter::Info);
136+
137+
if let Some(compile_time_filter) = option_env!("HERMIT_LOG_DEFAULT").or_else(|| {
138+
option_env!("HERMIT_LOG_LEVEL_FILTER").inspect(|_| {
139+
warn!("HERMIT_LOG_LEVEL_FILTER is deprecated in favor of HERMIT_LOG_DEFAULT");
140+
})
141+
}) {
142+
filter_builder.parse(compile_time_filter);
143+
}
125144

126-
log::set_logger(&KERNEL_LOGGER).expect("Can't initialize logger");
127-
// Determines LevelFilter at compile time
128-
let log_level: Option<&'static str> = option_env!("HERMIT_LOG_LEVEL_FILTER");
129-
let max_level = if let Some(log_level) = log_level {
130-
let filter = env_filter::Builder::new()
131-
// The default. It may get overwritten by the parsed filter if it has a global level.
132-
.filter_level(LevelFilter::Info)
133-
.parse(log_level)
134-
.build();
135-
let max_level = filter.filter();
136-
KERNEL_LOGGER.filter.set(filter).unwrap();
137-
max_level
138-
} else {
139-
LevelFilter::Info
140-
};
145+
if let Some(runtime_filter) = env::var("HERMIT_LOG") {
146+
filter_builder.parse(runtime_filter);
147+
}
141148

142-
log::set_max_level(max_level);
149+
let filter = filter_builder.build();
150+
log::set_max_level(filter.filter());
151+
KERNEL_LOGGER.filter.set(filter).unwrap();
143152
}
144153

145154
#[cfg_attr(target_arch = "riscv64", allow(unused))]

0 commit comments

Comments
 (0)