当 Rust 跟踪库使用多个日志目标时,如何限制日志级别?

Kal*_*exx 6 rust rust-tracing

我有以下代码,适用于我的 rust 应用程序,将日志写入 stdout 和滚动 json 文件。

    let appender = tracing_appender::rolling::hourly(app_log_path.clone(), "application.log");
    let (non_blocking, _guard) = tracing_appender::non_blocking(appender);

    let subscriber = tracing_subscriber::registry()
        .with(fmt::Layer::new().with_writer(std::io::stdout).pretty())
        .with(fmt::Layer::new().with_writer(non_blocking).json());

    tracing::subscriber::set_global_default(subscriber).expect("Unable to set a global collector");
Run Code Online (Sandbox Code Playgroud)

这有效,但会记录所有日志记录级别,包括详细跟踪日志记录。我想将日志限制为仅信息级别,但不知道如何做到这一点。

从跟踪文档来看,它说要做:

fmt()
    .with_max_level(Level::DEBUG)
    .init();
Run Code Online (Sandbox Code Playgroud)

但是,我在上面的代码中找不到任何可以添加.with_max_level()函数调用的地方。我尝试放置的每个地方都给出了不同的特征违规。例如

 the following trait bounds were not satisfied:
           `tracing_subscriber::fmt::Layer<_, Pretty, Format<Pretty>, fn() -> std::io::Stdout {std::io::stdout}>: MakeWriter<'_>`
           which is required by `tracing_subscriber::fmt::Layer<_, Pretty, Format<Pretty>, fn() -> std::io::Stdout {std::io::stdout}>: MakeWriterExt`
           `&tracing_subscriber::fmt::Layer<_, Pretty, Format<Pretty>, fn() -> std::io::Stdout {std::io::stdout}>: MakeWriter<'_>`
           which is required by `&tracing_subscriber::fmt::Layer<_, Pretty, Format<Pretty>, fn() -> std::io::Stdout {std::io::stdout}>: MakeWriterExt`
           `&mut tracing_subscriber::fmt::Layer<_, Pretty, Format<Pretty>, fn() -> std::io::Stdout {std::io::stdout}>: MakeWriter<'_>`
           which is required by `&mut tracing_subscriber::fmt::Layer<_, Pretty, Format<Pretty>, fn() -> std::io::Stdout {std::io::stdout}>: MakeWriterExt`
Run Code Online (Sandbox Code Playgroud)

kmd*_*eko 7

.with_max_level()Trait提供了一种方法MakeWriterExt。它应该被称为作家制作者,在你的例子中是stdoutnon_blocking

use tracing_subscriber::fmt::writer::MakeWriterExt;
// or
// tracing_subscriber::prelude::*;

let subscriber = tracing_subscriber::registry()
    .with(fmt::Layer::new().with_writer(std::io::stdout.with_max_level(Level::INFO)).pretty())
    .with(fmt::Layer::new().with_writer(non_blocking.with_max_level(Level::INFO)).json());
Run Code Online (Sandbox Code Playgroud)