Skip to main content

x_one/xlog/
mod.rs

1//! xlog - 日志模块
2//!
3//! 基于 `tracing` + `tracing-subscriber` 实现,
4//! 提供 JSON 格式文件日志、控制台彩色输出、异步写入等功能。
5
6pub mod config;
7pub mod console;
8pub mod init;
9pub mod kv_layer;
10pub mod otel_fmt;
11
12pub use config::{LogLevel, XLOG_CONFIG_KEY, XLogConfig};
13pub use kv_layer::SpanKvFields;
14
15use std::sync::atomic::{AtomicBool, Ordering};
16
17/// 幂等注册标志
18static REGISTERED: AtomicBool = AtomicBool::new(false);
19
20/// 注册日志 Hook(幂等,多次调用只注册一次)
21pub fn register_hook() {
22    if REGISTERED
23        .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
24        .is_err()
25    {
26        return;
27    }
28
29    crate::before_start!(init::init_xlog, crate::xhook::HookOptions::new().order(30));
30    crate::before_stop!(
31        init::shutdown_xlog,
32        crate::xhook::HookOptions::new().order(i32::MAX - 30)
33    );
34}
35
36// ============ KV 注入宏 ============
37
38/// 创建携带 KV 字段的 Span,作用域内所有日志自动携带这些 KV
39///
40/// 返回一个 `Entered` guard,guard 存活期间所有日志自动包含指定的 KV 字段。
41///
42/// # Examples
43///
44/// ```
45/// use x_one::{xlog_kv, xlog_info};
46///
47/// let _guard = xlog_kv!(user_id = "123", request_id = "abc");
48/// // 此后的日志自动携带 user_id 和 request_id
49/// ```
50#[macro_export]
51macro_rules! xlog_kv {
52    ($($arg:tt)*) => {
53        tracing::info_span!("", $($arg)*).entered()
54    };
55}
56
57// ============ 日志宏 ============
58
59/// INFO 级别日志
60#[macro_export]
61macro_rules! xlog_info {
62    ($($arg:tt)*) => {
63        tracing::info!($($arg)*)
64    };
65}
66
67/// ERROR 级别日志
68#[macro_export]
69macro_rules! xlog_error {
70    ($($arg:tt)*) => {
71        tracing::error!($($arg)*)
72    };
73}
74
75/// WARN 级别日志
76#[macro_export]
77macro_rules! xlog_warn {
78    ($($arg:tt)*) => {
79        tracing::warn!($($arg)*)
80    };
81}
82
83/// DEBUG 级别日志
84#[macro_export]
85macro_rules! xlog_debug {
86    ($($arg:tt)*) => {
87        tracing::debug!($($arg)*)
88    };
89}