Split driver log level env

This commit is contained in:
Wildan M
2026-01-10 06:35:06 +07:00
parent 992b856d66
commit d08c6cbe6f
6 changed files with 63 additions and 16 deletions
+2 -2
View File
@@ -4,7 +4,7 @@ use alloc::borrow::ToOwned;
use alloc::vec::Vec;
use syscall::flag::{O_CLOEXEC, O_RDONLY};
use syscall::{EINTR, Error};
use syscall::{Error, EINTR};
use redox_rt::proc::*;
@@ -62,7 +62,7 @@ pub fn main() -> ! {
if let Some(log_env) = envs
.iter()
.find_map(|var| var.strip_prefix(b"BOOT_LOG_LEVEL="))
.find_map(|var| var.strip_prefix(b"BOOTSTRAP_LOG_LEVEL="))
{
if let Ok(Ok(log_level)) = str::from_utf8(&log_env).map(|s| log::LevelFilter::from_str(s)) {
log::set_max_level(log_level);
+50 -2
View File
@@ -1,7 +1,9 @@
use std::str::FromStr;
use libredox::{flag, Fd};
use redox_log::{OutputBuilder, RedoxLogger};
pub fn output_level() -> log::LevelFilter {
//TODO: adjust with bootloader environment
log::LevelFilter::Info
}
@@ -15,9 +17,13 @@ pub fn setup_logging(
category: &str,
subcategory: &str,
logfile_base: &str,
output_level: log::LevelFilter,
mut output_level: log::LevelFilter,
file_level: log::LevelFilter,
) {
if let Some(log_level) = read_bootloader_log_level_env(category, subcategory) {
output_level = log_level;
}
let mut logger = RedoxLogger::new().with_output(
OutputBuilder::stderr()
.with_filter(output_level) // limit global output to important info
@@ -57,3 +63,45 @@ pub fn setup_logging(
logger.enable().expect("failed to set default logger");
}
fn read_bootloader_log_level_env(category: &str, subcategory: &str) -> Option<log::LevelFilter> {
let mut env_bytes = [0_u8; 4096];
// TODO: Have the kernel env can specify prefixed env key instead of having to read all of them
let envs = {
let Ok(fd) = Fd::open("/scheme/sys/env", flag::O_RDONLY | flag::O_CLOEXEC, 0) else {
return None;
};
let Ok(bytes_read) = fd.read(&mut env_bytes) else {
return None;
};
if bytes_read >= env_bytes.len() {
return None;
}
let env_bytes = &mut env_bytes[..bytes_read];
env_bytes
.split(|&c| c == b'\n')
.filter(|var| var.starts_with(b"DRIVER_"))
.collect::<Vec<_>>()
};
let log_env_keys = [
format!("DRIVER_{}_LOG_LEVEL=", subcategory.to_ascii_uppercase()),
format!("DRIVER_{}_LOG_LEVEL=", category.to_ascii_uppercase()),
"DRIVER_LOG_LEVEL=".to_string(),
];
for log_env_key in log_env_keys {
let log_env_key = log_env_key.as_bytes();
if let Some(log_env) = envs.iter().find_map(|var| var.strip_prefix(log_env_key)) {
if let Ok(Ok(log_level)) =
str::from_utf8(&log_env).map(|s| log::LevelFilter::from_str(s))
{
return Some(log_level);
}
}
}
None
}
+2 -1
View File
@@ -24,7 +24,8 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! {
"graphics",
"pci",
&name,
log::LevelFilter::Debug, //common::output_level(),
// TODO: common::output_level() once stable
log::LevelFilter::Debug,
common::file_level(),
);
+7 -9
View File
@@ -236,15 +236,13 @@ fn main() {
}
fn daemon(daemon: daemon::Daemon) -> ! {
let mut args = pico_args::Arguments::from_env();
let verbosity = (0..).find(|_| !args.contains("-v")).unwrap_or(0);
let log_level = match verbosity {
0 => log::LevelFilter::Info,
1 => log::LevelFilter::Debug,
_ => log::LevelFilter::Trace,
};
common::setup_logging("bus", "pci", "pcid", log_level, log::LevelFilter::Info);
common::setup_logging(
"bus",
"pci",
"pcid",
common::output_level(),
common::file_level(),
);
let pcie = Pcie::new();
let mut tree = BTreeMap::new();
+1 -1
View File
@@ -34,7 +34,7 @@ fn main() {
"usb",
"device",
&name,
log::LevelFilter::Warn,
common::output_level(),
common::file_level(),
);
+1 -1
View File
@@ -129,7 +129,7 @@ fn daemon_with_context_size<const N: usize>(
"usb",
"host",
&name,
log::LevelFilter::Warn,
common::output_level(),
common::file_level(),
);