rust 如何关闭其他crate发出的跟踪事件?

bnl4lu3b  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(139)

我使用tracing,我只想看到我自己的调试事件。然而,我依赖的一些crate也有跟踪支持,它们会破坏事件流。所以当我将详细程度增加到DEBUG时,我会在日志中看到很多这样的事件:

2022-08-04T20:52:24.523161Z DEBUG hyper::proto::h1::io: flushed 1008 bytes

字符串
我试图通过在这些调用周围添加span来关闭这些事件:

let response = {
    let span = tracing::info_span!("my_span");
    let _guard = span.enter();
    client
        // set up the request
        .send()
        .await
};


我期望那些第三方DEBUG事件会消失,因为span的详细级别是INFO。但是它们仍然存在。docs of spans对于span的详细级别的真正含义来说有点轻,所以我的解释可能完全错误。
如何设置依赖crate的详细级别,以便在跟踪日志中只显示我自己的DEBUG事件?
我使用环境变量RUST_LOG=debug设置详细级别,并像这样设置tracing-subscriber:

tracing_subscriber::fmt::init();


Cargo.toml相关部分:

tracing = "0.1.36"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }

zqdjd7g9

zqdjd7g91#

由于您在使用"env-filter"时启用了"env-filter"功能,因此它可以从您的环境中读取数据,因此您已经拥有了根据自己的喜好过滤日志所需的所有组件。
您可以简单地设置RUST_LOG如下(插入您自己的crate为“mycrate”):

RUST_LOG=none,mycrate=debug

字符串
这将禁用所有跟踪事件的日志记录,除非它们来自“mycrate”,如果它们处于调试级别或更高级别,则会记录日志。您可以阅读EnvFilter指令的文档以获得更多自定义。

pjngdqdw

pjngdqdw2#

要以编程方式执行此操作,请执行以下操作:

// as a deny filter (DEBUG, but remove noisy logs)
let filter = EnvFilter::builder()
    .with_default_directive(LevelFilter::DEBUG.into())
    .from_env()?
    .add_directive("hyper::proto=info".parse()?);

// or as an allow list (INFO, but drill into my crate's logs)
let filter = EnvFilter::builder()
    .with_default_directive(LevelFilter::INFO.into())
    .from_env()?
    .add_directive("mycrate=debug".parse()?);

tracing_subscriber::fmt()
    .with_env_filter(filter)
    .compact()
    .init();

字符串
add_directive()方法接受一个Directive,如果您正在编写CLI工具,也可以基于命令行参数创建该Directive

相关问题