You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tauri中配置每日生成一个独立日志文件?

如何在Tauri中配置每日生成一个独立日志文件?

嘿,我刚好碰到过类似的需求!其实tauri_plugin_log本身没有直接提供按天分割日志的现成配置项,但我们可以通过自定义日志输出逻辑来实现这个功能,下面给你两种可行的方案:

方案一:用Fern手动配置每日日志文件(简单易上手)

tauri_plugin_log底层基于Fern日志库,我们可以直接用Fern的文件输出功能,结合日期来命名日志文件,步骤如下:

  1. 确保你的Cargo.toml里已经添加了必要依赖:
[dependencies]
chrono = "0.4"
fern = "0.6"
tauri-plugin-log = "2.0" # 版本请匹配你的Tauri版本
  1. 在应用的setup函数里自定义日志配置:
use chrono::Local;
use fern::log_file;
use tauri::Manager;
use tauri_plugin_log::{fern::colors::ColoredLevelConfig};

fn main() {
    tauri::Builder::default()
        .setup(|app| {
            // 先确保日志目录存在
            let log_dir = app.path_resolver()
                .app_log_dir()
                .expect("获取日志目录失败");
            std::fs::create_dir_all(&log_dir).expect("创建日志目录失败");

            // 生成带当日日期的日志文件名,比如 "app_2024-05-20.log"
            let log_file_path = log_dir.join(format!("app_{}.log", Local::now().format("%Y-%m-%d")));

            // 配置Fern日志输出
            fern::Dispatch::new()
                // 自定义日志格式,包含时间、日志级别和内容
                .format(move |out, message, record| {
                    out.finish(format_args!(
                        "[{}][{}] {}",
                        Local::now().format("%Y-%m-%d %H:%M:%S"),
                        record.level(),
                        message
                    ))
                })
                // 设置日志级别,这里是Info及以上
                .level(log::LevelFilter::Info)
                // 输出到当日的日志文件
                .chain(log_file(log_file_path).expect("创建日志文件失败"))
                // 同时保留控制台输出,方便开发调试
                .chain(fern::Dispatch::new()
                    .format(move |out, message, record| {
                        out.finish(format_args!(
                            "[{}][{}] {}",
                            Local::now().format("%Y-%m-%d %H:%M:%S"),
                            ColoredLevelConfig::default().color(record.level()),
                            message
                        ))
                    })
                    .chain(std::io::stdout()))
                .apply()
                .expect("初始化日志器失败");

            Ok(())
        })
        .plugin(tauri_plugin_log::Builder::default().build())
        .run(tauri::generate_context!())
        .expect("运行Tauri应用出错");
}

⚠️ 注意:这个方案的小局限是,如果应用持续运行跨天,不会自动切换到新的日志文件,需要重启应用才会生成次日的日志。如果你的应用不需要长时间连续运行,这个方案完全够用。

方案二:用Log4rs实现自动轮转的每日日志(适合长期运行的应用)

如果你的应用需要7*24小时运行,想要自动跨天生成新日志文件,可以用Log4rs的时间轮转策略,步骤如下:

  1. 添加Log4rs依赖到Cargo.toml:
[dependencies]
log4rs = "1.2"
tauri-plugin-log = "2.0"
  1. 在setup函数里配置Log4rs的时间轮转规则:
use log4rs::append::rolling_file::{
    policy::compound::roll::fixed_window::FixedWindowRoller,
    policy::compound::trigger::time::TimeTrigger,
    policy::compound::CompoundPolicy, RollingFileAppender,
};
use log4rs::config::{Appender, Config, Root};
use log4rs::encode::pattern::PatternEncoder;
use tauri::Manager;

fn main() {
    tauri::Builder::default()
        .setup(|app| {
            // 确保日志目录存在
            let log_dir = app.path_resolver()
                .app_log_dir()
                .expect("获取日志目录失败");
            std::fs::create_dir_all(&log_dir).expect("创建日志目录失败");

            // 配置日志文件路径和轮转模式
            let log_file_path = log_dir.join("app.log");
            // 轮转后的日志文件名格式,比如 "app_2024-05-20.log"
            let roller = FixedWindowRoller::builder()
                .base(1)
                .count(7) // 保留最近7天的日志
                .pattern(log_dir.join("app_{%Y-%m-%d}.log").to_str().unwrap())
                .build()
                .expect("创建日志轮转器失败");

            // 设置每天零点触发轮转
            let trigger = TimeTrigger::builder()
                .interval(std::time::Duration::from_secs(86400)) // 24小时
                .modulate(true) // 对齐到自然时间边界(比如零点)
                .build()
                .expect("创建时间触发器失败");

            // 组合轮转策略
            let policy = CompoundPolicy::new(Box::new(trigger), Box::new(roller));

            // 创建滚动文件输出器
            let appender = RollingFileAppender::builder()
                .encoder(Box::new(PatternEncoder::new("{d(%Y-%m-%d %H:%M:%S)} [{l}] {m}{n}")))
                .build(log_file_path, Box::new(policy))
                .expect("创建滚动日志输出器失败");

            // 构建Log4rs配置
            let config = Config::builder()
                .appender(Appender::builder().build("daily_log", Box::new(appender)))
                .build(Root::builder()
                    .appender("daily_log")
                    .build(log::LevelFilter::Info))
                .expect("构建Log4rs配置失败");

            // 初始化日志器
            log4rs::init_config(config).expect("初始化Log4rs失败");

            Ok(())
        })
        .plugin(tauri_plugin_log::Builder::default().build())
        .run(tauri::generate_context!())
        .expect("运行Tauri应用出错");
}

这个方案会在每天零点自动切换到新的日志文件,并且自动保留最近7天的日志文件,完全不需要手动干预,非常适合长期运行的应用。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:59:51