From 4f987ce0383505bb42003606fa26d8a62dbbd347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= Date: Thu, 25 Jan 2024 15:02:58 +0100 Subject: [PATCH] Fix log level selection In https://github.com/Nitrokey/nethsm-pkcs11/pull/176 I wanted to allow RUST_LOG overriding the config file, but it also made the config file be always ignored when file logging was enabled --- pkcs11/src/config/logging.rs | 38 ++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/pkcs11/src/config/logging.rs b/pkcs11/src/config/logging.rs index bf40449a..53428f5d 100644 --- a/pkcs11/src/config/logging.rs +++ b/pkcs11/src/config/logging.rs @@ -1,3 +1,4 @@ +use std::env; use std::path::PathBuf; use log::{info, warn, LevelFilter}; @@ -162,8 +163,13 @@ pub fn configure_logger(config: &Result<(P11Config, Vec), Initializatio } } + let mut log_level: LevelFilter = config + .log_level + .map(Into::into) + .unwrap_or_else(log::max_level); + if use_file { - let mut builder = env_logger::Builder::from_default_env(); + let mut builder = env_logger::Builder::new(); let path = &config.log_file.as_deref().unwrap_or("-".as_ref()); @@ -190,23 +196,29 @@ pub fn configure_logger(config: &Result<(P11Config, Vec), Initializatio }; } - env_logger = Some(builder.build()); - } - - // RUST_LOG must override the default filter - match (env_logger.as_ref(), config.log_level.as_ref()) { - (Some(logger), Some(config_filter)) => { - log::set_max_level(logger.filter().min(LevelFilter::from(*config_filter))); + let mut override_filter = false; + if let Ok(filters) = env::var("RUST_LOG") { + builder.parse_filters(&filters); + override_filter = true; + } else if let Some(filter) = config.log_level { + builder.filter_level(filter.into()); } - (Some(logger), _) if logger.filter() > LevelFilter::Error => { - log::set_max_level(logger.filter()); + + if let Ok(format) = env::var("RUST_LOG_STYLE") { + builder.parse_write_style(&format); } - (None, Some(level)) => { - log::set_max_level((*level).into()); + + let tmp = builder.build(); + + if override_filter { + log_level = tmp.filter(); } - _ => {} + + env_logger = Some(tmp); } + log::set_max_level(log_level); + log::set_boxed_logger(Box::new(MultiLog { syslog_logger, env_logger,