logging: implement a way to set logging levels and categories by env variables

This commit is contained in:
2026-01-03 14:50:18 +01:00
parent fa57c0ce81
commit 23043a42a2

View File

@@ -5,19 +5,19 @@ use static_cell::StaticCell;
// Provides a threadsafe serial logger // Provides a threadsafe serial logger
pub struct RenderbugLogger { pub struct RenderbugLogger {
lock: Mutex<CriticalSectionRawMutex, ()> lock: Mutex<CriticalSectionRawMutex, ()>,
default_level: LevelFilter
} }
impl Default for RenderbugLogger { impl Default for RenderbugLogger {
fn default() -> Self { fn default() -> Self {
Self { Self {
lock: Mutex::new(()) lock: Mutex::new(()),
default_level: LevelFilter::Info
} }
} }
} }
static MAX_LEVEL: LevelFilter = LevelFilter::Debug;
static LOGGER: StaticCell<RenderbugLogger> = StaticCell::new(); static LOGGER: StaticCell<RenderbugLogger> = StaticCell::new();
impl RenderbugLogger { impl RenderbugLogger {
@@ -25,17 +25,27 @@ impl RenderbugLogger {
#[cfg(feature = "rtt")] #[cfg(feature = "rtt")]
rtt_target::rtt_init_print!(rtt_target::ChannelMode::BlockIfFull); rtt_target::rtt_init_print!(rtt_target::ChannelMode::BlockIfFull);
let logger = LOGGER.init(Default::default()); let default_level = match option_env!("LOG_LEVEL").unwrap_or("info").to_lowercase().as_str() {
"debug" => LevelFilter::Debug,
"warn" => LevelFilter::Warn,
"trace" => LevelFilter::Trace,
"error" => LevelFilter::Error,
_ => LevelFilter::Info
};
let logger = LOGGER.init(RenderbugLogger { default_level, ..Default::default() });
unsafe { unsafe {
critical_section::with(|_| {
log::set_logger_racy(logger).ok(); log::set_logger_racy(logger).ok();
log::set_max_level_racy(MAX_LEVEL); log::set_max_level_racy(default_level);
});
}; };
} }
} }
impl log::Log for RenderbugLogger { impl log::Log for RenderbugLogger {
fn enabled(&self, metadata: &Metadata) -> bool { fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() >= MAX_LEVEL metadata.level() >= self.default_level
} }
fn flush(&self) {} fn flush(&self) {}
@@ -58,21 +68,17 @@ impl log::Log for RenderbugLogger {
}; };
let filename = record.file().map_or("???", |f| {f}); let filename = record.file().map_or("???", |f| {f});
let prefix = if filename.chars().nth(0).unwrap() == '/' { let crate_name = record.module_path_static().unwrap();
if record.level() < LevelFilter::Info { for enabled in option_env!("LOG_CRATES").unwrap_or("").split(",") {
record.module_path_static().unwrap() if crate_name.starts_with(enabled) {
} else {
return;
}
} else {
filename.split('/').next().unwrap()
};
let suffix = filename.split('/').next_back().unwrap();
self.lock.lock(|_| { self.lock.lock(|_| {
#[cfg(feature = "rtt")] #[cfg(feature = "rtt")]
rtt_target::rprintln!("{}{}\t{}{}/{}:{}{}\t{}{}", color, record.level(), GREY, prefix, suffix, record.line().map_or(0, |f| {f}), RESET, record.args(), RESET); rtt_target::rprintln!("{}{}\t{}{}:{}{}\t{}{}", color, record.level(), GREY, filename, record.line().map_or(0, |f| {f}), RESET, record.args(), RESET);
println!("{color}{}\t{GREY}{} {prefix}/{suffix}:{}{RESET}\t{}{RESET}", record.level(), record.module_path_static().unwrap(), record.line().map_or(0, |f| {f}), record.args()); println!("{color}{}\t{GREY}{} {filename}:{}{RESET}\t{}{RESET}", record.level(), record.module_path_static().unwrap(), record.line().map_or(0, |f| {f}), record.args());
}); });
return;
}
}
} }
} }