如何显示跟踪事件的行号和文件?

Sim*_*son 4 rust rust-tracing

如何使用跟踪line!跟踪file!订阅者打印来源和跟踪日志

我正在使用的代码准备充分,包含大量日志打印,这很好,但其中大多数都不是很有描述性:

# Cargo.toml
[dependencies]
tracing = "0.1.35"
tracing-subscriber = "0.3.11"
Run Code Online (Sandbox Code Playgroud)
tracing_subscriber::fmt::init();

// ...

if let Err(e) = important_work.await {
    tracing::info!(" {:?}", &e);
};
Run Code Online (Sandbox Code Playgroud)

并且控制台仅打印显示模块和错误消息,而不打印代码失败的位置。当我将其替换为:

pub struct CustomLayer;

impl<S> Layer<S> for CustomLayer
where
    S: tracing::Subscriber,
{
    fn on_event(
        &self,
        event: &tracing::Event<'_>,
        _ctx: tracing_subscriber::layer::Context<'_, S>,
    ) {
         println!("{level}  name={:?}", event.metadata().name());
         for field in event.fields() {
            println!("  field={}", field);
         }
      }
}

   // Snip to main()

   tracing_subscriber::registry().with(CustomLayer).init();
Run Code Online (Sandbox Code Playgroud)

我能够获取文件和行event.metadata().name()),但随后所有错误消息都变成字符串“message”。可能有一种更简单的方法可以打印行号。

Cha*_*man 8

您可以按照文档中的指定自定义格式化程序。一些选项是with_file()with_line_number()

tracing_subscriber::fmt()
    .event_format(
        tracing_subscriber::fmt::format()
            .with_file(true)
            .with_line_number(true)
    )
    .init();
Run Code Online (Sandbox Code Playgroud)

示例输出(没有颜色):

2022-07-12T06:05:35.654279Z  INFO playground: src/main.rs:16: abc
Run Code Online (Sandbox Code Playgroud)

您当然可以根据需要使用其他选项。