人人都会AI编程

20.4 日志体系

更新时间:2026-07-11

日志从哪里来?

一个 Tauri 应用会产生三类日志:

  1. Rust 后端日志:你的 Rust 代码(命令、插件、主进程逻辑)通过标准的 log 宏输出的日志。
  2. 前端 WebView 日志console.logconsole.error 等在 WebView 中输出的信息。
  3. 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-appenderlog4rs。一个简单的文件日志示例:

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=debugtrace,前端日志全部转发,便于追踪交互流程。 |
| 生产构建 | 限制日志级别为 warnerror,避免性能损耗和敏感信息泄露。 |
| 分发诊断 | 提供“导出日志”功能,将日志文件打包提供给用户反馈,方便定位问题。 |

你可以通过 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 桥接到统一后端,所有日志通过环境变量或代码灵活控制。这种设计让你在开发和调试时能看到完整信息,而在生产环境中又能保持整洁、低开销。只需几行配置,你就能拥有一个跨运行时的全功能日志系统。