yao_dev_common/log/
mod.rs

1use std::env;
2use time::macros::{format_description, offset};
3use tracing_appender::rolling::{RollingFileAppender, Rotation};
4use tracing_subscriber::filter::LevelFilter;
5use tracing_subscriber::fmt::time::OffsetTime;
6use tracing_subscriber::layer::SubscriberExt;
7use tracing_subscriber::{fmt, EnvFilter};
8
9/// 初始化日志配置
10///
11/// stdout_layer 配置工作台输出
12///
13/// file_layer 配置文件滚动输出
14///
15/// tracing_subscriber 注册全局
16///
17pub fn trace_log_init() {
18    let app_name = env::var("CARGO_PKG_NAME").unwrap_or_else(|_| "default_rust".to_string());
19    let app_name_log = app_name.clone() + ".log";
20    //  配置日志文件滚动
21    let file_appender = RollingFileAppender::new(
22        Rotation::DAILY, // 每天
23        "/var/log/rust", // 日志目录
24        app_name_log,    // 日志文件名
25    );
26    // 设置日志日期格式
27    let time_fmt =
28        format_description!("[year]-[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]");
29    // 设置日期时区
30    let timer = OffsetTime::new(offset!(+8), time_fmt);
31    // 初始化日志订阅
32    let file_layer = fmt::Layer::new()
33        .with_writer(file_appender)
34        .with_timer(timer.clone())
35        .with_ansi(false);
36    let stdout_layer = fmt::Layer::new()
37        .with_writer(std::io::stdout)
38        .with_timer(timer.clone());
39    let subscriber = tracing_subscriber::registry()
40        .with(EnvFilter::from_default_env().add_directive(LevelFilter::INFO.into()))
41        .with(file_layer)
42        .with(stdout_layer);
43    // 设置全局订阅
44    tracing::subscriber::set_global_default(subscriber).expect("Failed to set subscriber");
45}