use std::sync::OnceLock;
use tracing_subscriber::filter::LevelFilter;
use tracing_subscriber::fmt::format::FmtSpan;
use tracing_subscriber::{Registry, prelude::*, reload};
static LOG_LEVEL_RELOAD_HANDLE: OnceLock<reload::Handle<LevelFilter, Registry>> = OnceLock::new();
pub struct ConfigLogger;
impl ConfigLogger {
pub fn init(level: LevelFilter) {
let (filter, handle) = reload::Layer::new(level);
tracing_subscriber::registry()
.with(filter)
.with(
tracing_subscriber::fmt::layer()
.with_level(true)
.with_target(false)
.with_span_events(FmtSpan::NONE),
)
.init();
LOG_LEVEL_RELOAD_HANDLE.set(handle).expect(
"Logger should be initialized once. \
`Registry::init` would panic before anyway.",
);
}
pub fn update(level: LevelFilter) {
let handle = LOG_LEVEL_RELOAD_HANDLE
.get()
.expect("Logging must be initialized before.");
handle.modify(|f| *f = level).unwrap();
}
}