日志从哪里来?
一个 Tauri 应用会产生三类日志:
- Rust 后端日志:你的 Rust 代码(命令、插件、主进程逻辑)通过标准的
log宏输出的日志。 - 前端 WebView 日志:
console.log、console.error等在 WebView 中输出的信息。 - Tauri 内部日志:框架本身的启动、IPC、窗口管理等内部事件。
Tauri 的日志系统将这些日志统一路由、过滤并输出,你只需少量配置就能同时控制所有来源的日志。
开启并配置日志
1. 在 Rust 端启用日志
Tauri 基于 Rust 生态的 log 门面和 env_logger(或 tracing-subscriber)实现日志输出。在你的 src-tauri/src/main.rs 中,最少只需要一行:
fn main() {
// 初始化日志,默认读取 RUST_LOG 环境变量控制级别
env_logger::init();
tauri::Builder::default()
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
然后你就可以在任意 Rust 代码中使用标准日志宏:
use log::{info, warn, error, debug};
#[tauri::command]
fn perform_action() {
info!("用户请求执行操作");
if some_error {
error!("操作失败,原因:{}", reason);
}
}
你还可以通过设置 RUST_LOG 环境变量来控制日志级别:
# 开发时显示所有 trace 日志
RUST_LOG=trace cargo tauri dev
# 只显示 warn 及以上
RUST_LOG=warn cargo tauri dev
# 控制特定模块的日志级别
RUST_LOG=info,my_app=debug cargo tauri dev
2. 将前端日志导入 Rust 日志系统
Tauri 提供了一个插件 tauri-plugin-log,可以把 WebView 中的 console.xxx 调用转发到 Rust 日志后端,与 Rust 日志一同管理。
安装插件(v2 中为 npm + cargo 同时添加):
npm install @tauri-apps/plugin-log
然后在 Rust 中注册:
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_log::Builder::default().build())
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
配置完成后,前端代码中的 console.info("前端事件") 就会出现在终端的日志流里,并且同样受 RUST_LOG 过滤。
3. 将日志写入文件
默认的 env_logger 只输出到终端(stderr),如果你想持久化日志,推荐使用 tracing-appender 或 log4rs。一个简单的文件日志示例:
use log::LevelFilter;
use log4rs::append::file::FileAppender;
use log4rs::config::{Appender, Config, Root};
fn setup_logging() {
let file_appender = FileAppender::builder()
.build("app.log")
.unwrap();
let config = Config::builder()
.appender(Appender::builder().build("file", Box::new(file_appender)))
.build(Root::builder().appender("file").build(LevelFilter::Info))
.unwrap();
log4rs::init_config(config).unwrap();
}
这样所有日志(包括从 WebView 转发来的)都会同时出现在终端和 app.log 文件中。
Tauri 内置的日志 API
Tauri 还为简单场景提供了一个内置的日志工具,不需要额外依赖就能写入文件。你可以在 Rust 命令中使用 tauri::api::path 获取应用日志目录,然后手动写入。但通常情况下,env_logger + tauri-plugin-log 的组合已经足够应对绝大多数需求。
开发 vs 生产环境的日志策略
| 场景 | 推荐设置 |
| -------- | ------------------------------------------------------------------------ |
| 开发阶段 | RUST_LOG=debug 或 trace,前端日志全部转发,便于追踪交互流程。 |
| 生产构建 | 限制日志级别为 warn 或 error,避免性能损耗和敏感信息泄露。 |
| 分发诊断 | 提供“导出日志”功能,将日志文件打包提供给用户反馈,方便定位问题。 |
你可以通过 Tauri 的构造函数动态设置日志级别,而不依赖环境变量:
std::env::set_var("RUST_LOG", "info");
env_logger::init();
实用提醒
- 日志输出位置:使用
env_logger时,日志默认输出到 stderr。若在 Windows 上后台运行应用,可能看不见日志,可以重定向到文件。 - 前端大量日志:开启
tauri-plugin-log后,所有console.log都会经过 IPC 传递到 Rust 端,若频繁调用可能带来性能影响。生产环境应移除调试性质的console.log或通过插件过滤级别。 - 日志格式化:
env_logger支持自定义格式,如添加时间戳、目标模块等,可在初始化时配置。 - 日志轮转:若使用文件日志,建议搭配
log4rs的滚动文件附加器,避免单个日志文件无限增长。
总结
Tauri 的日志体系简单而实用:Rust 端用 log + env_logger(或更强大的 tracing),前端通过 tauri-plugin-log 桥接到统一后端,所有日志通过环境变量或代码灵活控制。这种设计让你在开发和调试时能看到完整信息,而在生产环境中又能保持整洁、低开销。只需几行配置,你就能拥有一个跨运行时的全功能日志系统。