如何关闭Rust中其他依赖crate输出的tracing追踪事件?
问题描述
使用tracing库时,希望仅查看自身crate的DEBUG级日志事件,但部分依赖crate(如hyper)也支持tracing,导致日志中充斥第三方DEBUG事件,例如:
2022-08-04T20:52:24.523161Z DEBUG hyper::proto::h1::io: flushed 1008 bytes
尝试通过包裹INFO级别的span来调用外部代码,期望过滤第三方DEBUG事件,但无效:
let response = { let span = tracing::info_span!("my_span"); let _guard = span.enter(); client // 设置请求 .send() .await };
当前通过环境变量RUST_LOG=debug设置日志级别,tracing-subscriber初始化代码:
tracing_subscriber::fmt::init();
Cargo.toml相关配置:
tracing = "0.1.36" tracing-subscriber = { version = "0.3", features = ["env-filter"] }
请问如何设置依赖crate的日志级别,使日志仅显示自身的DEBUG事件?
解决方案
1. 精准配置RUST_LOG环境变量
直接通过环境变量指定自身crate的日志级别为DEBUG,同时将全局默认级别设为INFO(或更高),这样第三方crate的DEBUG日志会被过滤。将my_crate替换为你自己的crate名称(即Cargo.toml中name字段的值):
RUST_LOG=my_crate=debug,info
如果需要单独禁止某个特定依赖的日志,也可以明确设置:
RUST_LOG=my_crate=debug,hyper=info
2. 在代码中直接配置过滤规则
如果不想依赖环境变量,可以在初始化tracing-subscriber时直接创建EnvFilter并设置规则:
use tracing_subscriber::{fmt, EnvFilter}; fn main() { // 配置自身crate为DEBUG,全局默认INFO let filter = EnvFilter::new("my_crate=debug,info"); fmt().with_env_filter(filter).init(); }
为什么包裹span的方法无效?
span的级别仅控制span自身是否被记录,并不会过滤该span下产生的子事件或第三方crate的日志。日志事件的过滤是由全局的EnvFilter统一控制的,和父span的级别没有关联,所以之前的方法无法达到预期效果。
内容的提问来源于stack exchange,提问作者aedm
相关产品推荐
相关产品推荐

