secra_logger/
detector.rs

1use once_cell::sync::OnceCell;
2use tracing::dispatcher;
3
4/// 日志模式
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum LoggingMode {
7    /// 库模式:仅使用 tracing 宏,不初始化 subscriber
8    Library,
9    /// 应用模式:初始化 subscriber,配置输出目标
10    Application,
11}
12
13/// Subscriber 检测器(带缓存)
14pub struct SubscriberDetector;
15
16static DETECTED_MODE: OnceCell<LoggingMode> = OnceCell::new();
17
18impl SubscriberDetector {
19    /// 检测系统中是否已经初始化了 tracing subscriber。
20    ///
21    /// 实现原理:`tracing::dispatcher::has_been_set()` 检测全局 dispatcher 是否已设置。
22    #[inline]
23    pub fn has_subscriber() -> bool {
24        dispatcher::has_been_set()
25    }
26
27    /// 检测并返回模式(结果会被缓存)
28    pub fn detect_mode() -> LoggingMode {
29        *DETECTED_MODE.get_or_init(|| {
30            if Self::has_subscriber() {
31                LoggingMode::Library
32            } else {
33                LoggingMode::Application
34            }
35        })
36    }
37}