#env-var #logging #log #logger

env_logger_successor

一个通过环境变量配置的 log 日志实现

1 个不稳定版本

0.9.1 2022年7月27日

#360调试

每月28次下载

MIT/Apache

140KB
2K SLoC

env_logger

Maintenance crates.io Documentation Documentation

通过环境变量配置的日志记录器实现。

用法

在库中

env_logger 在可执行文件(二进制项目)中使用时很有意义。库应使用 log 包。

在可执行文件中

它必须与 log 一起添加到项目的依赖中

[dependencies]
log = "0.4.0"
env_logger = "0.9.1"

env_logger 必须在项目中最早期初始化。初始化后,您可以使用 log 宏进行实际的日志记录。

#[macro_use]
extern crate log;

fn main() {
    env_logger::init();

    info!("starting up");

    // ...
}

然后当运行可执行文件时,指定一个与您想显示的日志消息对应的 RUST_LOG 环境变量值。

$ RUST_LOG=info ./main
[2018-11-03T06:09:06Z INFO  default] starting up

日志级别的字母大小写不敏感;例如,debugDEBUGdEbuG 都表示相同的日志级别。因此,前面的例子也可以这样写,指定日志级别为 INFO 而不是 info

$ RUST_LOG=INFO ./main
[2018-11-03T06:09:06Z INFO  default] starting up

那么应该使用哪种形式?为了保持一致性,我们的约定是使用小写名称。在我们的文档中使用其他形式的地方,它们都是在特定示例的上下文中使用的,所以如果你在野外看到类似的用法,你不会感到惊讶。

本地时区功能

 [dependencies]
log = "0.4.0"
env_logger = {version="0.9.1",features = ["localtime"]}

# output
[2022-07-27T10:34:44+08:00 INFO  log] starting up

可以指定的日志级别对应于 log 包中 log::Level 枚举。它们是:

  • error
  • warn
  • info
  • debug
  • trace

还有一个伪日志级别 off,可以指定以禁用特定模块或整个应用程序的所有日志。与日志级别一样,字母大小写不敏感。

env_logger 除了可以通过环境变量配置外,还可以通过其他方式进行配置。请参阅示例了解更多方法。

在测试中

测试可以使用 env_logger 包来查看测试过程中生成的日志消息。

[dependencies]
log = "0.4.0"

[dev-dependencies]
env_logger = "0.9.1"
#[macro_use]
extern crate log;

fn add_one(num: i32) -> i32 {
    info!("add_one called with {}", num);
    num + 1
}

#[cfg(test)]
mod tests {
    use super::*;

    fn init() {
        let _ = env_logger::builder().is_test(true).try_init();
    }

    #[test]
    fn it_adds_one() {
        init();

        info!("can log from the test too");
        assert_eq!(3, add_one(2));
    }

    #[test]
    fn it_handles_negative_numbers() {
        init();

        info!("logging from another test");
        assert_eq!(-7, add_one(-8));
    }
}

假设正在测试的模块名为 my_lib,使用 RUST_LOG 过滤器运行测试,以从该模块获取信息消息,其命令如下

$ RUST_LOG=my_lib=info cargo test
     Running target/debug/my_lib-...

running 2 tests
[INFO my_lib::tests] logging from another test
[INFO my_lib] add_one called with -8
test tests::it_handles_negative_numbers ... ok
[INFO my_lib::tests] can log from the test too
[INFO my_lib] add_one called with 2
test tests::it_adds_one ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured

请注意,在您想要启用日志记录的每个测试中都需要调用 env_logger::try_init()。此外,由于测试默认并行运行,日志输出可能会与测试输出交织在一起。您可以通过指定 RUST_TEST_THREADS=1 来在单个线程中运行测试,或者通过指定测试名称作为测试二进制程序的参数来运行单个测试,具体操作请参考 cargo test 帮助文档。

$ RUST_LOG=my_lib=info cargo test it_adds_one
     Running target/debug/my_lib-...

running 1 test
[INFO my_lib::tests] can log from the test too
[INFO my_lib] add_one called with 2
test tests::it_adds_one ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

配置日志目标

默认情况下,env_logger 将日志记录到 stderr。如果您想将日志记录到 stdout,可以使用 Builder 来更改日志目标。

use std::env;
use env_logger::{Builder, Target};

let mut builder = Builder::from_default_env();
builder.target(Target::Stdout);

builder.init();

默认格式的稳定性

默认格式不会针对长期稳定性进行优化,并且在 0.x 的主要、次要或补丁版本升级期间,明确定义不保证其输出的稳定性。

如果您想以编程方式捕获或解释 env_logger 的输出,则应使用自定义格式。

依赖项

~3–12MB
~119K SLoC