secra-logger 3.0.3

一个生产级的 Rust 日志系统库,基于 tracing 生态系统构建,支持结构化 JSON 日志、文件滚动、UTC+8 时区等特性
Documentation
use once_cell::sync::OnceCell;
use tracing::dispatcher;

/// 日志模式
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LoggingMode {
    /// 库模式:仅使用 tracing 宏,不初始化 subscriber
    Library,
    /// 应用模式:初始化 subscriber,配置输出目标
    Application,
}

/// Subscriber 检测器(带缓存)
pub struct SubscriberDetector;

static DETECTED_MODE: OnceCell<LoggingMode> = OnceCell::new();

impl SubscriberDetector {
    /// 检测系统中是否已经初始化了 tracing subscriber。
    ///
    /// 实现原理:`tracing::dispatcher::has_been_set()` 检测全局 dispatcher 是否已设置。
    #[inline]
    pub fn has_subscriber() -> bool {
        dispatcher::has_been_set()
    }

    /// 检测并返回模式(结果会被缓存)
    pub fn detect_mode() -> LoggingMode {
        *DETECTED_MODE.get_or_init(|| {
            if Self::has_subscriber() {
                LoggingMode::Library
            } else {
                LoggingMode::Application
            }
        })
    }
}