From 23043a42a22438143da0320f011cfd22047a9bc4 Mon Sep 17 00:00:00 2001 From: Victoria Fischer Date: Sat, 3 Jan 2026 14:50:18 +0100 Subject: [PATCH] logging: implement a way to set logging levels and categories by env variables --- src/logging.rs | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/logging.rs b/src/logging.rs index 7eb9e50..8ea0401 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -5,19 +5,19 @@ use static_cell::StaticCell; // Provides a threadsafe serial logger pub struct RenderbugLogger { - lock: Mutex + lock: Mutex, + default_level: LevelFilter } impl Default for RenderbugLogger { fn default() -> Self { Self { - lock: Mutex::new(()) + lock: Mutex::new(()), + default_level: LevelFilter::Info } } } -static MAX_LEVEL: LevelFilter = LevelFilter::Debug; - static LOGGER: StaticCell = StaticCell::new(); impl RenderbugLogger { @@ -25,17 +25,27 @@ impl RenderbugLogger { #[cfg(feature = "rtt")] 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 { - log::set_logger_racy(logger).ok(); - log::set_max_level_racy(MAX_LEVEL); + critical_section::with(|_| { + log::set_logger_racy(logger).ok(); + log::set_max_level_racy(default_level); + }); }; } } impl log::Log for RenderbugLogger { fn enabled(&self, metadata: &Metadata) -> bool { - metadata.level() >= MAX_LEVEL + metadata.level() >= self.default_level } fn flush(&self) {} @@ -58,21 +68,17 @@ impl log::Log for RenderbugLogger { }; let filename = record.file().map_or("???", |f| {f}); - let prefix = if filename.chars().nth(0).unwrap() == '/' { - if record.level() < LevelFilter::Info { - record.module_path_static().unwrap() - } else { + let crate_name = record.module_path_static().unwrap(); + for enabled in option_env!("LOG_CRATES").unwrap_or("").split(",") { + if crate_name.starts_with(enabled) { + self.lock.lock(|_| { + #[cfg(feature = "rtt")] + 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}{} {filename}:{}{RESET}\t{}{RESET}", record.level(), record.module_path_static().unwrap(), record.line().map_or(0, |f| {f}), record.args()); + }); return; } - } else { - filename.split('/').next().unwrap() - }; - let suffix = filename.split('/').next_back().unwrap(); - self.lock.lock(|_| { - #[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); - - 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()); - }); + } } }