为何指定RUST_LOG=debug时cargo test仍显示trace!日志?如何仅查看自身crate的DEBUG级日志?
当然可以!你完全可以精准控制测试日志,只显示自己 crate 的 DEBUG 级别日志,同时屏蔽所有依赖库的日志输出。这里有两种简单可行的实现方式:
方式一:通过
RUST_LOG 环境变量精准配置 SimpleLogger 兼容 env_logger 的环境变量规则,你可以通过指定具体 crate 的日志级别,同时关闭所有其他依赖的日志。
步骤:
- 先确认你的 crate 名称(查看
Cargo.toml里的name字段,比如假设叫my_crate) - 运行测试时使用以下命令:
RUST_LOG=my_crate=debug,all=off cargo test -- --nocapture
my_crate=debug:指定你的 crate 输出 DEBUG 及以上级别的日志(如果只想仅显示纯DEBUG级别,排除INFO/WARN/ERROR,可参考方式二的代码过滤)all=off:关闭所有未明确指定的 target(也就是依赖库)的日志-- --nocapture:必须加上这个参数,因为cargo test默认会捕获标准输出,只有测试失败时才会显示日志,加了它才能实时看到日志内容
方式二:代码层面强制过滤(更稳妥)
如果你想在代码里固定日志规则,避免每次运行都要设置环境变量,可以修改 init_logger 函数,添加自定义过滤器,只允许当前 crate 的 DEBUG 日志通过:
use log::{Level, Metadata, Record}; use once_cell::sync::Once; use simple_logger::SimpleLogger; static INIT_LOGGER: Once = Once::new(); pub fn init_logger() { INIT_LOGGER.call_once(|| { // 自定义过滤规则:只放行当前 crate 的 DEBUG 级别日志 let filter = |metadata: &Metadata| { // 用 CARGO_PKG_NAME 自动获取当前 crate 名称,不用硬编码 metadata.target().starts_with(env!("CARGO_PKG_NAME")) && metadata.level() == Level::Debug }; SimpleLogger::new() .with_custom_filter(filter) .init() .unwrap(); }); }
这样修改后,不管环境变量怎么设置,都会只显示你自己 crate 的 DEBUG 日志。运行测试时只需要执行:
cargo test -- --nocapture
补充说明:
- 如果你想保留自己 crate 的 WARN/ERROR 日志,只屏蔽依赖和自己的 INFO/TRACE,只需要把环境变量改成
RUST_LOG=my_crate=debug,all=off即可,这样会显示 DEBUG、WARN、ERROR 级别的自有日志,依赖日志全关。 - 如果你还是想结合环境变量的灵活性,同时确保依赖日志默认关闭,可以在初始化时这样写:
SimpleLogger::new() .with_env() // 读取 RUST_LOG 环境变量 .with_default_level(LevelFilter::Off) // 默认关闭所有未指定的 target 日志 .init() .unwrap();
然后用 RUST_LOG=my_crate=debug cargo test -- --nocapture 运行,效果和方式一一致,但代码层面做了兜底。
内容的提问来源于stack exchange,提问作者djfm
相关产品推荐
相关产品推荐

