moduforge_core/
logging.rs

1use std::path::PathBuf;
2use tracing::Level;
3use tracing_subscriber::{
4    fmt::{self},
5    EnvFilter,
6    prelude::*,
7};
8
9/// 初始化日志系统
10///
11/// # Arguments
12/// * `log_level` - 日志级别,默认为 INFO
13/// * `log_file` - 日志文件路径,如果为 None 则只输出到控制台
14pub fn init_logging(
15    log_level: Option<Level>,
16    log_file: Option<PathBuf>,
17) -> anyhow::Result<()> {
18    // 设置日志级别
19    let level = log_level.unwrap_or(Level::INFO);
20    let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| {
21        EnvFilter::new(format!("info,{}", level.as_str().to_lowercase()))
22    });
23
24    // 创建控制台输出
25    let console_layer = fmt::layer()
26        .with_target(false)
27        .with_thread_ids(false)
28        .with_thread_names(false)
29        .with_ansi(true)
30        .with_file(true)
31        .with_line_number(true);
32
33    // 创建订阅者
34    let subscriber =
35        tracing_subscriber::registry().with(env_filter).with(console_layer);
36
37    // 如果指定了日志文件,添加文件输出
38    if let Some(log_file) = log_file {
39        let directory =
40            log_file.parent().unwrap_or(&PathBuf::from(".")).to_path_buf();
41        let file_appender =
42            tracing_appender::rolling::RollingFileAppender::builder()
43                .rotation(tracing_appender::rolling::Rotation::DAILY)
44                .filename_prefix("moduforge")
45                .filename_suffix("log")
46                .build(&directory)?;
47
48        let file_layer = fmt::layer()
49            .with_target(false)
50            .with_thread_ids(false)
51            .with_thread_names(false)
52            .with_ansi(false)
53            .with_file(true)
54            .with_line_number(true)
55            .with_writer(file_appender);
56
57        subscriber.with(file_layer).init();
58    } else {
59        subscriber.init();
60    }
61
62    Ok(())
63}
64
65/// 获取当前日志级别
66pub fn get_log_level() -> Level {
67    tracing::level_filters::LevelFilter::current()
68        .into_level()
69        .unwrap_or(Level::INFO)
70}
71
72/// 设置日志级别
73pub fn set_log_level(level: Level) {
74    tracing_subscriber::filter::LevelFilter::from_level(level);
75}