use crate::global;
use crate::global::{LogFormat, LogRolling};
pub use tracing::{debug, error, info, trace, warn};
pub use tracing::{debug_span, error_span, info_span, trace_span, warn_span};
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::EnvFilter;
use std::sync::LazyLock;
pub(crate) static TRACING: LazyLock<WorkerGuard> = LazyLock::new(|| {
if !global::SETTINGS.log.enabled || cfg!(test) || cfg!(feature = "testing") {
tracing::subscriber::set_global_default(tracing::subscriber::NoSubscriber::default())
.expect("Failed to install global NoSubscriber (tracing disabled)");
let (_, guard) = tracing_appender::non_blocking(std::io::sink());
return guard;
}
let env_filter = EnvFilter::try_new(&global::SETTINGS.log.tracing)
.unwrap_or_else(|_| EnvFilter::new("Info"));
let rolling = global::SETTINGS.log.rolling;
let (non_blocking, guard) = match rolling {
LogRolling::Stdout => tracing_appender::non_blocking(std::io::stdout()),
_ => tracing_appender::non_blocking({
let path = &global::SETTINGS.log.path;
let prefix = &global::SETTINGS.log.prefix;
match rolling {
LogRolling::Daily => tracing_appender::rolling::daily(path, prefix),
LogRolling::Hourly => tracing_appender::rolling::hourly(path, prefix),
LogRolling::Minutely => tracing_appender::rolling::minutely(path, prefix),
LogRolling::Endless => tracing_appender::rolling::never(path, prefix),
LogRolling::Stdout => unreachable!("Stdout rolling already handled above"),
}
}),
};
let subscriber = tracing_subscriber::fmt()
.with_env_filter(env_filter)
.with_writer(non_blocking)
.with_ansi(matches!(rolling, LogRolling::Stdout));
match global::SETTINGS.log.format {
LogFormat::Json => subscriber.json().init(),
LogFormat::Full => subscriber.init(),
LogFormat::Compact => subscriber.compact().init(),
LogFormat::Pretty => subscriber.pretty().init(),
}
guard
});