logger: Respect config file log level

- Fixes a bug where the log level set in the config file was
  ignored: `Logger` and `StderrLogger` captured the level in a
  `self.level` field at construction time and checked it in
  `Log::enabled`. After config was loaded, the global
  `log::set_max_level` was updated but `self.level` was not,
  so verbose messages were dropped by the per-instance filter
  even when the global filter allowed them.
- Make `log::set_max_level` the single source of truth: remove
  the `level` field and have `Log::enabled` defer to
  `log::max_level()` so the two filters can no longer drift.
- Update call sites to construct loggers without a level.
- Disable the structured logger's internal filter (set to "trace") so
  that it also falls back to `log::set_max_level`.
This commit is contained in:
Daniel Norman 2026-05-04 17:55:26 +02:00 committed by Fintan Halpenny
parent 9177146794
commit 6b460c4429
4 changed files with 29 additions and 16 deletions

View File

@ -138,7 +138,7 @@ fn main() {
} }
if let Some(lvl) = radicle::logger::env_level() { if let Some(lvl) = radicle::logger::env_level() {
let logger = Box::new(radicle::logger::Logger::new(lvl)); let logger = Box::new(radicle::logger::Logger::new());
log::set_boxed_logger(logger).expect("no other logger should have been set already"); log::set_boxed_logger(logger).expect("no other logger should have been set already");
log::set_max_level(lvl.to_level_filter()); log::set_max_level(lvl.to_level_filter());
} }

View File

@ -376,7 +376,12 @@ fn initialize_logging(options: &LogOptions) -> Result<(), Box<dyn std::error::Er
LogFormat::Json => json::new_writer(io::stdout()), LogFormat::Json => json::new_writer(io::stdout()),
}; };
Box::new(Builder::new().with_default_writer(writer).build()) // Set to trace (via `Level::max`) and defer to log::set_max_level for filtering
Box::new(
Builder::with_level(log::Level::max().as_str())
.with_default_writer(writer)
.build(),
)
} }
#[cfg(all(feature = "systemd", target_os = "linux"))] #[cfg(all(feature = "systemd", target_os = "linux"))]
Logger::Systemd => { Logger::Systemd => {
@ -398,7 +403,7 @@ fn initialize_logging(options: &LogOptions) -> Result<(), Box<dyn std::error::Er
const SYSLOG_IDENTIFIER: &str = "radicle-node"; const SYSLOG_IDENTIFIER: &str = "radicle-node";
logger::<&str, &str, _>(SYSLOG_IDENTIFIER.to_string(), []).map_err(Box::new)? logger::<&str, &str, _>(SYSLOG_IDENTIFIER.to_string(), []).map_err(Box::new)?
} }
Logger::Radicle => Box::new(radicle::logger::Logger::new(level)), Logger::Radicle => Box::new(radicle::logger::Logger::new()),
} }
}; };

View File

@ -52,7 +52,7 @@ fn main() {
let mut args = env::args(); let mut args = env::args();
if let Some(lvl) = radicle::logger::env_level() { if let Some(lvl) = radicle::logger::env_level() {
let logger = radicle::logger::StderrLogger::new(lvl); let logger = radicle::logger::StderrLogger::new();
log::set_boxed_logger(Box::new(logger)) log::set_boxed_logger(Box::new(logger))
.expect("no other logger should have been set already"); .expect("no other logger should have been set already");
log::set_max_level(lvl.to_level_filter()); log::set_max_level(lvl.to_level_filter());

View File

@ -13,19 +13,23 @@ use colored::*;
use log::{Level, Log, Metadata, Record}; use log::{Level, Log, Metadata, Record};
/// A logger that logs to `stdout`. /// A logger that logs to `stdout`.
pub struct Logger { pub struct Logger;
level: Level,
}
impl Logger { impl Logger {
pub fn new(level: Level) -> Self { pub fn new() -> Self {
Self { level } Self
}
}
impl Default for Logger {
fn default() -> Self {
Self::new()
} }
} }
impl Log for Logger { impl Log for Logger {
fn enabled(&self, metadata: &Metadata) -> bool { fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= self.level metadata.level() <= log::max_level()
} }
fn log(&self, record: &Record) { fn log(&self, record: &Record) {
@ -60,19 +64,23 @@ impl Log for Logger {
} }
/// A logger that logs to `stderr`. /// A logger that logs to `stderr`.
pub struct StderrLogger { pub struct StderrLogger;
level: Level,
}
impl StderrLogger { impl StderrLogger {
pub fn new(level: Level) -> Self { pub fn new() -> Self {
Self { level } Self
}
}
impl Default for StderrLogger {
fn default() -> Self {
Self::new()
} }
} }
impl Log for StderrLogger { impl Log for StderrLogger {
fn enabled(&self, metadata: &Metadata) -> bool { fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= self.level metadata.level() <= log::max_level()
} }
fn log(&self, record: &Record) { fn log(&self, record: &Record) {