use std::io::Write;
use std::sync::Once;
struct StderrLogger {
level: log::LevelFilter,
}
impl log::Log for StderrLogger {
fn enabled(&self, metadata: &log::Metadata) -> bool {
metadata.level() <= self.level
}
fn log(&self, record: &log::Record) {
if self.enabled(record.metadata()) {
let _ = writeln!(
std::io::stderr(),
"[frust {}] {}",
record.level(),
record.args()
);
}
}
fn flush(&self) {
let _ = std::io::stderr().flush();
}
}
pub fn init_once() {
static LOGGER: Once = Once::new();
LOGGER.call_once(|| {
let level = std::env::var("FRUST_LOG")
.ok()
.and_then(|raw| raw.parse::<log::LevelFilter>().ok())
.unwrap_or(log::LevelFilter::Info);
let logger: &'static StderrLogger = Box::leak(Box::new(StderrLogger { level }));
if log::set_logger(logger).is_ok() {
log::set_max_level(level);
}
log::info!("frust-shell-desktop: logger initialized");
});
}
#[cfg(test)]
mod tests {
use super::*;
use log::{Level, Log, Metadata, MetadataBuilder};
fn metadata(target: &str, level: Level) -> Metadata<'_> {
MetadataBuilder::new().target(target).level(level).build()
}
#[test]
fn targets_are_never_suppressed() {
let logger = StderrLogger {
level: log::LevelFilter::Info,
};
for target in [
"some_gpu_crate::scene",
"frust_shell_common::perf",
"some_other_crate",
] {
let meta = metadata(target, Level::Warn);
assert!(
logger.enabled(&meta),
"{target} at Warn should be enabled under an Info filter"
);
}
}
}