如何过滤tracing框架中的hyper crate日志,仅保留应用日志?
解决tracing框架过滤hyper crate日志的问题
你当前代码的核心问题有两个:
- 设置的
hyper=debug是保留hyper的debug级别及以上日志,和你想要过滤掉hyper日志的需求完全相反; with_filter方法会覆盖之前的过滤规则,导致你自定义的日志配置失效。
以下是两种正确的实现方案:
方案一:精准过滤hyper,保留自身应用日志
假设你的应用 crate 名称是my_app(替换为你实际的 crate 名称),可以直接通过过滤规则禁用hyper日志,同时保留自己应用的日志:
use tracing_subscriber::{fmt, EnvFilter, Registry}; // 过滤规则:关闭hyper所有日志,保留自身应用info及以上级别日志 let filter = EnvFilter::new("hyper=off,my_app=info") .add_directive(EnvFilter::from_default_env()); // 可选:兼容环境变量中的日志配置 let logger = Registry::default() .with(filter) .with(fmt::Layer::default().event_format(format)); // 这里的format是你自定义的日志格式器 tracing::subscriber::set_global_default(logger).unwrap();
方案二:仅保留自身应用日志,过滤所有第三方crate
如果需要同时过滤其他第三方crate的日志,只需指定自身应用的日志规则即可:
use tracing_subscriber::{fmt, EnvFilter, Registry}; // 仅保留自身应用的info及以上日志,默认过滤其他所有crate let filter = EnvFilter::new("my_app=info") .add_directive(EnvFilter::from_default_env()); let logger = Registry::default() .with(filter) .with(fmt::Layer::default().event_format(format)); tracing::subscriber::set_global_default(logger).unwrap();
额外排查要点
- 确认自身应用的日志宏(如
info!、debug!)是否正确关联了你的crate目标,比如显式指定target: "my_app",或者在crate根目录设置默认target; - 检查是否有其他代码逻辑覆盖了全局subscriber配置;
- 如果使用
from_default_env(),确保环境变量RUST_LOG中没有hyper=*这类会覆盖你规则的配置。
内容的提问来源于stack exchange,提问作者fxdom
相关产品推荐
相关产品推荐

