use std::sync::OnceLock;
use tracing_subscriber::filter::EnvFilter;
use tracing_subscriber::fmt;
use tracing_subscriber::prelude::*;
use tracing_subscriber::reload;
use super::GlobalLoggerRegistry;
use crate::loader::LoggingConfig;
type FilterHandle = reload::Handle<EnvFilter, tracing_subscriber::Registry>;
static FILTER_HANDLE: OnceLock<FilterHandle> = OnceLock::new();
fn build_filter(config: &LoggingConfig) -> EnvFilter {
EnvFilter::try_from_env("PASTA_LOG")
.or_else(|_| EnvFilter::try_new(config.to_filter_directive()))
.unwrap_or_else(|e| {
eprintln!(
"Warning: Failed to parse log filter '{}', using default: {}",
config.to_filter_directive(),
e
);
EnvFilter::new("info")
})
}
pub fn init_tracing_with_reload(config: &LoggingConfig) {
let filter = build_filter(config);
let (filter_layer, handle) = reload::Layer::new(filter);
let result = tracing_subscriber::registry()
.with(
fmt::layer()
.with_writer(GlobalLoggerRegistry::instance().clone())
.with_ansi(false)
.with_target(true)
.with_level(true)
.with_filter(filter_layer),
)
.try_init();
if result.is_ok() {
let _ = FILTER_HANDLE.set(handle);
}
}
pub fn update_tracing_filter(config: &LoggingConfig) {
if let Some(handle) = FILTER_HANDLE.get() {
let new_filter = build_filter(config);
let _ = handle.reload(new_filter);
}
}