logging: implement a way to set logging levels and categories by env variables
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user