1 个不稳定版本
0.9.1 | 2022年7月27日 |
---|
#360 在 调试
每月28次下载
140KB
2K SLoC
env_logger
通过环境变量配置的日志记录器实现。
用法
在库中
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
日志级别的字母大小写不敏感;例如,debug
、DEBUG
和 dEbuG
都表示相同的日志级别。因此,前面的例子也可以这样写,指定日志级别为 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