use crate::{logger::TransportHandle, Logger};
use logform::LogInfo;
use std::sync::OnceLock;
use winston_transport::Transport;
static GLOBAL_LOGGER: OnceLock<Logger> = OnceLock::new();
pub fn init(logger: Logger) {
GLOBAL_LOGGER
.set(logger)
.expect("Global logger already initialized. Call init() only once.");
}
fn global_logger() -> &'static Logger {
GLOBAL_LOGGER
.get()
.expect("Global logger not initialized. Call winston::global::init() first.")
}
fn try_global_logger() -> Option<&'static Logger> {
GLOBAL_LOGGER.get()
}
pub fn is_initialized() -> bool {
GLOBAL_LOGGER.get().is_some()
}
pub fn log(entry: logform::LogInfo) {
global_logger().log(entry);
}
pub fn is_level_enabled_fast(level: &str) -> bool {
match try_global_logger() {
Some(logger) => logger.is_level_enabled_fast(level),
None => true,
}
}
pub fn try_log(entry: logform::LogInfo) -> bool {
if let Some(logger) = try_global_logger() {
logger.log(entry);
true
} else {
false
}
}
pub fn configure(new_options: Option<crate::LoggerOptions>) {
global_logger().configure(new_options);
}
pub fn flush() -> Result<(), String> {
global_logger().flush()
}
pub fn close() {
global_logger().close();
}
pub fn query(options: &winston_transport::LogQuery) -> Result<Vec<logform::LogInfo>, String> {
global_logger().query(options)
}
pub fn add_transport<T>(transport: T) -> TransportHandle
where
T: Transport<LogInfo> + Send + Sync + 'static,
{
global_logger().add_transport(transport)
}
pub fn remove_transport(handle: TransportHandle) -> bool {
global_logger().remove_transport(handle)
}
#[cfg(feature = "log-backend")]
pub fn register_with_log() -> Result<(), log::SetLoggerError> {
let logger = global_logger();
log::set_logger(logger)?;
log::set_max_level(log::LevelFilter::Trace);
Ok(())
}