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 文件中同时添加 logenv_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_appdebug 日志,

而其他依赖库的日志保持 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 的设计哲学:

让日志的记录与处理彻底分离。