Feat: Lädt Log-Level einmalig aus der Konfiguration und passt Logik an.

This commit is contained in:
2025-08-20 16:10:49 +02:00
parent 2991370051
commit 39eb799df3

View File

@@ -28,6 +28,7 @@ use std::sync::{Mutex, OnceLock};
use time::{macros::format_description, OffsetDateTime}; use time::{macros::format_description, OffsetDateTime};
use crate::program; use crate::program;
use crate::config;
/// Schweregrade für Logeinträge in aufsteigender Detailtiefe. /// Schweregrade für Logeinträge in aufsteigender Detailtiefe.
/// ///
@@ -61,12 +62,25 @@ impl Display for LogLevel {
} }
} }
impl TryFrom<String> for LogLevel {
type Error = LogLevel;
fn try_from(value: std::string::String) -> Result<Self, Self> {
match value.to_lowercase().as_str() {
"error" => Ok(LogLevel::Error),
"warn" => Ok(LogLevel::Warn),
"info" => Ok(LogLevel::Info),
"debug" => Ok(LogLevel::Debug),
_ => Err(LogLevel::Info)
}
}
}
/// Zwischenspeicher für die einmalig ermittelte Terminal-Fähigkeit von `stdout`. /// Zwischenspeicher für die einmalig ermittelte Terminal-Fähigkeit von `stdout`.
static IS_TERMINAL: OnceLock<bool> = OnceLock::new(); static IS_TERMINAL: OnceLock<bool> = OnceLock::new();
/// Globaler Schweregradfilter für Ausgabe. /// Globaler Schweregradfilter für Ausgabe.
/// TODO: In Zukunft aus Konfiguration laden. static LOG_LEVEL: OnceLock<LogLevel> = OnceLock::new();
static LOG_LEVEL: LogLevel = LogLevel::Debug;
/// Lazy-initialisiertes Handle zur Logdatei; kann `None` sein, falls das Öffnen fehlschlug. /// Lazy-initialisiertes Handle zur Logdatei; kann `None` sein, falls das Öffnen fehlschlug.
static LOG_FILE: OnceLock<Mutex<Option<File>>> = OnceLock::new(); static LOG_FILE: OnceLock<Mutex<Option<File>>> = OnceLock::new();
@@ -92,7 +106,7 @@ static LOG_FILE: OnceLock<Mutex<Option<File>>> = OnceLock::new();
/// log("http", "Server gestartet auf Port 8080", LogLevel::Info); /// log("http", "Server gestartet auf Port 8080", LogLevel::Info);
/// ``` /// ```
pub fn log(tag: &str, message: &str, log_level: LogLevel) { pub fn log(tag: &str, message: &str, log_level: LogLevel) {
if log_level <= LOG_LEVEL { if log_level <= get_log_level() {
let message: String = format_message(tag, message, &log_level); let message: String = format_message(tag, message, &log_level);
if is_terminal() { if is_terminal() {
@@ -113,6 +127,21 @@ pub fn log(tag: &str, message: &str, log_level: LogLevel) {
} }
} }
/// Liefert das einmalig initialisierte Log-Level für die Filterung.
///
/// Ermittelt das konfigurierte Log-Level aus der Config-Datei.
/// Wenn ungültig oder nicht vorhanden, wird LogLevel::Info als Fallback verwendet.
///
/// Rückgabe:
/// - `LogLevel`: Das zu verwendende Log-Level als enum-Wert.
fn get_log_level() -> LogLevel {
*LOG_LEVEL.get_or_init(|| {
let log_level = &config::get_config().general.log_level;
LogLevel::try_from(log_level.to_string()).unwrap_or(LogLevel::Info)
}
)
}
/// Ermittelt einmalig, ob `stdout` ein Terminal ist, und cached das Ergebnis. /// Ermittelt einmalig, ob `stdout` ein Terminal ist, und cached das Ergebnis.
/// ///
/// Rückgabe: /// Rückgabe: