如何在Tauri中配置每日生成一个独立日志文件?
如何在Tauri中配置每日生成一个独立日志文件?
嘿,我刚好碰到过类似的需求!其实tauri_plugin_log本身没有直接提供按天分割日志的现成配置项,但我们可以通过自定义日志输出逻辑来实现这个功能,下面给你两种可行的方案:
方案一:用Fern手动配置每日日志文件(简单易上手)
tauri_plugin_log底层基于Fern日志库,我们可以直接用Fern的文件输出功能,结合日期来命名日志文件,步骤如下:
- 确保你的Cargo.toml里已经添加了必要依赖:
[dependencies] chrono = "0.4" fern = "0.6" tauri-plugin-log = "2.0" # 版本请匹配你的Tauri版本
- 在应用的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的时间轮转策略,步骤如下:
- 添加Log4rs依赖到Cargo.toml:
[dependencies] log4rs = "1.2" tauri-plugin-log = "2.0"
- 在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
相关产品推荐
相关产品推荐

