Skip to main content

alun_log/
lib.rs

1//! 日志初始化:根据配置设置 tracing 输出
2
3use tracing_subscriber::fmt::format::FmtSpan;
4use tracing_subscriber::EnvFilter;
5use tracing_appender::rolling::{RollingFileAppender, Rotation};
6
7/// 初始化日志系统
8///
9/// 根据 `LogConfig` 设置 tracing 输出:
10/// - `format = "text"`: 彩色文本格式(默认)
11/// - `format = "json"`: JSON 结构化格式(对接 ELK/Loki)
12/// - `dir` 非空时:日滚文件输出(按天创建新文件)
13/// - `dir` 为空时:标准输出
14///
15/// 优先从环境变量 `RUST_LOG` 读取过滤级别;
16/// 未设置则使用 `LogConfig.level`(默认 `info`)。
17pub fn init(config: &alun_config::LogConfig) {
18    let level = &config.level;
19    let filter = EnvFilter::try_from_default_env()
20        .unwrap_or_else(|_| EnvFilter::new(format!("alun={}", level)));
21
22    let format = config.format.as_str();
23
24    // JSON 格式
25    if format == "json" {
26        let subscriber = tracing_subscriber::fmt()
27            .with_env_filter(filter)
28            .with_span_events(FmtSpan::CLOSE)
29            .json();
30
31        if let Some(dir) = &config.dir {
32            let file_appender = RollingFileAppender::new(Rotation::DAILY, dir, &config.file_prefix);
33            let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
34            let _ = subscriber.with_writer(non_blocking).try_init();
35        } else {
36            let _ = subscriber.try_init();
37        }
38    } else {
39        let subscriber = tracing_subscriber::fmt()
40            .with_env_filter(filter)
41            .with_span_events(FmtSpan::CLOSE);
42
43        if let Some(dir) = &config.dir {
44            let file_appender = RollingFileAppender::new(Rotation::DAILY, dir, &config.file_prefix);
45            let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
46            let _ = subscriber.with_writer(non_blocking).try_init();
47        } else {
48            let _ = subscriber.try_init();
49        }
50    }
51}