diff --git a/Cargo.lock b/Cargo.lock index 3e5da2f0c..7d6b2d24e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -622,6 +622,7 @@ version = "0.4.1" dependencies = [ "iceoryx2-pal-concurrency-sync", "log", + "once_cell", "termsize", "tracing", ] diff --git a/doc/release-notes/iceoryx2-unreleased.md b/doc/release-notes/iceoryx2-unreleased.md index ca3ef937b..fce729b4f 100644 --- a/doc/release-notes/iceoryx2-unreleased.md +++ b/doc/release-notes/iceoryx2-unreleased.md @@ -36,6 +36,7 @@ * Rename `NodeEvent` into `WaitEvent` [#390](https://github.com/eclipse-iceoryx/iceoryx2/issues/390) * Bazel support for the Rust crates [#349](https://github.com/eclipse-iceoryx/iceoryx2/issues/349) * Remove ACL dependency [#457](https://github.com/eclipse-iceoryx/iceoryx2/issues/457) +* Read LogLevel from environment variable [#396](https://github.com/eclipse-iceoryx/iceoryx2/issues/396) ### Workflow diff --git a/iceoryx2-bb/log/BUILD.bazel b/iceoryx2-bb/log/BUILD.bazel index 3c452b0a4..143e0be33 100644 --- a/iceoryx2-bb/log/BUILD.bazel +++ b/iceoryx2-bb/log/BUILD.bazel @@ -25,6 +25,7 @@ rust_library( deps = [ "//iceoryx2-pal/concurrency-sync:iceoryx2-pal-concurrency-sync", "@crate_index//:termsize", + "@crate_index//:once_cell", ], ) diff --git a/iceoryx2-bb/log/Cargo.toml b/iceoryx2-bb/log/Cargo.toml index 1e6c88e0f..a937be523 100644 --- a/iceoryx2-bb/log/Cargo.toml +++ b/iceoryx2-bb/log/Cargo.toml @@ -21,3 +21,4 @@ iceoryx2-pal-concurrency-sync = { workspace = true } termsize = { workspace = true } log = { workspace = true, optional = true } tracing = { workspace = true, optional = true } +once_cell = { workspace = true } diff --git a/iceoryx2-bb/log/src/lib.rs b/iceoryx2-bb/log/src/lib.rs index db9e2eef8..12beda405 100644 --- a/iceoryx2-bb/log/src/lib.rs +++ b/iceoryx2-bb/log/src/lib.rs @@ -151,6 +151,8 @@ use std::{ }; use logger::Logger; +use once_cell::sync::Lazy; +use std::env; #[cfg(feature = "logger_tracing")] static DEFAULT_LOGGER: logger::tracing::Logger = logger::tracing::Logger::new(); @@ -159,9 +161,14 @@ static DEFAULT_LOGGER: logger::tracing::Logger = logger::tracing::Logger::new(); static DEFAULT_LOGGER: logger::log::Logger = logger::log::Logger::new(); #[cfg(not(any(feature = "logger_log", feature = "logger_tracing")))] -static DEFAULT_LOGGER: logger::console::Logger = logger::console::Logger::new(); +pub static DEFAULT_LOGGER: Lazy = + Lazy::new(logger::console::Logger::new); const DEFAULT_LOG_LEVEL: u8 = LogLevel::Info as u8; +pub static ENV_LOG_LEVEL: Lazy = Lazy::new(|| { + let log_level_str = env::var("IOX2_LOG_LEVEL").unwrap_or_else(|_| "Info".to_string()); + LogLevel::from_str(&log_level_str) // Default to Info +}); static mut LOGGER: Option<&'static dyn logger::Logger> = None; static LOG_LEVEL: IoxAtomicU8 = IoxAtomicU8::new(DEFAULT_LOG_LEVEL); @@ -179,6 +186,20 @@ pub enum LogLevel { Fatal = 5, } +impl LogLevel { + fn from_str(s: &str) -> LogLevel { + match s { + "Trace" => LogLevel::Trace, + "Debug" => LogLevel::Debug, + "Info" => LogLevel::Info, + "Warn" => LogLevel::Warn, + "Error" => LogLevel::Error, + "Fatal" => LogLevel::Fatal, + _ => LogLevel::Info, + } + } +} + /// Sets the current log level. This is ignored for external frameworks like `log` or `tracing`. /// Here you have to use the log-level settings of that framework. pub fn set_log_level(v: LogLevel) { @@ -187,6 +208,7 @@ pub fn set_log_level(v: LogLevel) { /// Returns the current log level pub fn get_log_level() -> u8 { + LOG_LEVEL.store(*ENV_LOG_LEVEL as u8, Ordering::Relaxed); LOG_LEVEL.load(Ordering::Relaxed) } @@ -205,7 +227,7 @@ pub fn set_logger(value: &'static T) -> bool { /// Returns a reference to the [`Logger`]. pub fn get_logger() -> &'static dyn Logger { INIT.call_once(|| { - unsafe { LOGGER = Some(&DEFAULT_LOGGER) }; + unsafe { LOGGER = Some(&*DEFAULT_LOGGER) }; }); unsafe { *LOGGER.as_ref().unwrap() } diff --git a/iceoryx2-bb/log/src/logger/log.rs b/iceoryx2-bb/log/src/logger/log.rs index ab1f6586b..195735751 100644 --- a/iceoryx2-bb/log/src/logger/log.rs +++ b/iceoryx2-bb/log/src/logger/log.rs @@ -10,7 +10,7 @@ // // SPDX-License-Identifier: Apache-2.0 OR MIT -use crate::LogLevel; +use crate::{init_log_level, LogLevel}; pub struct Logger { _priv: (), diff --git a/iceoryx2-bb/log/src/logger/tracing.rs b/iceoryx2-bb/log/src/logger/tracing.rs index 7362f6523..b2daa1de8 100644 --- a/iceoryx2-bb/log/src/logger/tracing.rs +++ b/iceoryx2-bb/log/src/logger/tracing.rs @@ -10,7 +10,7 @@ // // SPDX-License-Identifier: Apache-2.0 OR MIT -use crate::LogLevel; +use crate::{init_log_level, LogLevel}; pub struct Logger { _priv: (),