env_logger 详解
env_logger 可以说是 log crate 最常用、最经典的“官方”日志后端。
如果你把 log crate 比作电源插座的标准(它定义了接口),
那么 env_logger 就是一个可以直接插上就用的、功能齐全的电器。
一、env_logger 是什么?
env_logger 是一个开箱即用的日志后端。它的核心特点正如其名:通过环境变量来配置日志。
你不需要像在 rCore 教程里那样自己去实现 Log trait,
env_logger 已经帮你做好了。
它实现了一个非常完善的 Logger,不仅能打印日志级别、内容,还能自动加上时间戳、来源模块路径等信息。
二、与 rCore 的 SimpleLogger 的区别
| 特性 | SimpleLogger (rCore) | env_logger |
|---|---|---|
| 配置方式 | 编译时通过 option_env!("LOG") | 运行时通过 RUST_LOG 环境变量 |
| 功能 | 极简,只打印带颜色的级别和消息 | 功能丰富,可打印时间戳、模块路径等 |
| 适用环境 | no_std,适用于 OS 内核等嵌入式环境 | 依赖标准库(std),适用于普通应用程序 |
| 实现 | 需要自己手动 impl Log | 无需自己实现,直接调用 init() 即可 |
三、核心差异:编译时 vs 运行时 配置
最大的区别在于配置方式。
-
SimpleLogger 日志级别在编译时就已经固定。 如果你使用
LOG=INFO make run编译程序,那么它之后无论运行在哪里,都只会显示 INFO 及以上级别的日志。 想看 DEBUG 日志?必须重新编译。 -
env_logger 日志级别在运行时才读取。 同一个编译好的程序,可以通过不同命令控制日志输出,无需重新编译,极其灵活。
四、如何使用 env_logger?
使用它非常简单,基本是“三步走”。
第 1 步:添加依赖
在 Cargo.toml 文件中同时添加 log 和 env_logger:
[dependencies]
log = "0.4"
env_logger = "0.9"
第 2 步:在 main.rs 中初始化
在程序入口(通常是 main 函数)的最开始,加上一行初始化代码:
// main.rs
use log::{info, warn, debug};
fn main() {
// 初始化 env_logger
env_logger::init();
// 现在你就可以在任何地方使用 log 宏了
debug!("这是一个 debug 信息");
info!("程序启动成功!");
warn!("注意:某个配置项即将被废弃");
// ... 你的其他代码 ...
}
env_logger::init() 会帮你完成所有事情:
- 创建 Logger 实例
- 注册它 (
set_logger) - 读取环境变量并设置过滤级别 (
set_max_level)
第 3 步:运行并设置环境变量
编译程序:
cargo build
然后在终端中通过 RUST_LOG 环境变量控制日志输出。
1. 默认运行(不设置 RUST_LOG)
当 RUST_LOG 未设置时,env_logger 默认只显示 Error 级别的日志
(或不显示任何内容,取决于版本和默认设置)。
$ cargo run
# 可能什么输出都没有,或者只显示 ERROR 日志
2. 显示所有 info 级别及以上的日志
$ RUST_LOG=info cargo run
[2025-11-06T10:30:00Z INFO my_app] 程序启动成功!
[2025-11-06T10:30:00Z WARN my_app] 注意:某个配置项即将被废弃
此时 debug! 信息不会被打印。
3. 显示所有 debug 级别及以上的日志
$ RUST_LOG=debug cargo run
[2025-11-06T10:30:00Z DEBUG my_app] 这是一个 debug 信息
[2025-11-06T10:30:00Z INFO my_app] 程序启动成功!
[2025-11-06T10:30:00Z WARN my_app] 注意:某个配置项即将被废弃
4. 只显示特定模块的日志(高级用法)
这是 env_logger 的强大功能之一。
假设你的项目名叫 my_app,你只想看 my_app 的 debug 日志,
而其他依赖库的日志保持 info 级别:
# 格式: crate_name=level
$ RUST_LOG=my_app=debug cargo run
或者更复杂一点:
# my_app 显示 trace,而 hyper 库显示 info
$ RUST_LOG=my_app=trace,hyper=info cargo run
五、总结
env_logger 是编写普通 Rust 应用程序时的首选日志后端。它:
- 简单:一行代码
env_logger::init()即可启动。 - 灵活:无需重新编译,通过
RUST_LOG环境变量在运行时动态调整日志级别。 - 强大:支持按模块、按 crate 设置不同日志级别,非常适合调试复杂应用。
它完美体现了 log crate 的设计哲学:
让日志的记录与处理彻底分离。