标签: rust-tracing

如何在测试中打印跟踪输出?

我的应用程序使用tracingRust 箱来创建日志输出。当我运行测试时如何打印这些日志消息?

testing logging rust rust-tracing

6
推荐指数
1
解决办法
4933
查看次数

使用tracing-appender时如何避免文本着色?

当我使用跟踪附加程序将日志写入文件时,我得到带有终端颜色伪影的输出,当将它们作为文本文件查看时,这些伪影不会呈现:

[2mOct 02 23:44:57.484[0m [34mDEBUG[0m
Run Code Online (Sandbox Code Playgroud)

有没有办法去掉这些文物?

rust rust-tracing

5
推荐指数
1
解决办法
2581
查看次数

如何通过跟踪有条件地将日志写入多个目的地?

我尝试使用跟踪箱实现一些集中式日志记录。我可以使用跟踪附加程序箱写入滚动文件,或使用以下代码写入 Graylog 应用程序:

let mut guards = Vec::new();
if let Some(log) = config.logs {
    if let Some(file) = log.file {
        let file_appender = tracing_appender::rolling::hourly(file.directory, file.filename);
        let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
        guards.push(guard);
        let file_logger = tracing_subscriber::fmt()
            .with_writer(non_blocking)
            .init();
    }

    if let Some(graylog) = log.graylog {
        let address: SocketAddr = graylog.host.parse().expect("Unable to parse graylog host address");
        let bg_task = Logger::builder()
            .additional_field("module_id", graylog.module_id)
            .init_tcp(address)
            .unwrap();

        tokio::spawn(bg_task);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果日志配置仅包含.file.graylog定义之一,则它可以工作,但如果我同时定义这两个应用程序,则应用程序会在启动时崩溃。

我认为存在冲突,因为两者都试图设置默认收集器。有什么方法可以定义两者来接受每个跨度和事件?

rust rust-tracing

4
推荐指数
1
解决办法
3607
查看次数

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

如何使用跟踪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”。可能有一种更简单的方法可以打印行号。

rust rust-tracing

4
推荐指数
1
解决办法
1359
查看次数

如何使用 Rust 跟踪获取/存储跨度持续时间?

我想捕获 Rust 跟踪中跨度的执行持续时间并将其作为指标发送。

我发现 fmt() 有助于打印这里提到的内容:How can I log spanuration with Rust Tracing?

我还尝试过这个关于创建层和实现 on_new_span() 和 on_event() 的示例。我还添加了 on_close() 来检查我们在这里获得了哪些元数据。我写的代码是:

use tracing::{info, info_span};
use tracing_subscriber::prelude::*;
mod custom_layer;
use custom_layer::CustomLayer;

fn main() {

    tracing_subscriber::registry()
        .with(CustomLayer)
        .init();

    let outer_span = info_span!("Outer", level = 0, other_field = tracing::field::Empty);
    let _outer_entered = outer_span.enter();

    outer_span.record("other_field", &7);

    let inner_span = info_span!("inner", level = 1);
    let _inner_entered = inner_span.enter();

    info!(a_bool = true, answer = 42, message = "first example");

}
Run Code Online (Sandbox Code Playgroud)

自定义层.rs:

use std::collections::BTreeMap;
use …
Run Code Online (Sandbox Code Playgroud)

registry trace rust rust-tokio rust-tracing

3
推荐指数
1
解决办法
2022
查看次数

如何将字符串转换为与tracing_subscriber一起使用的级别?

我想使用字符串设置跟踪级别(因为我从环境变量获取级别)。

let env_log_level = std::env::var("LOG_LEVEL").unwrap();

tracing_subscriber::fmt()
    .with_max_level(tracing::Level::DEBUG) // somehow use env_log_level here
    .with_target(false)
    .init();
Run Code Online (Sandbox Code Playgroud)

我想这应该是一种将字符串解析为 Level 对象的方法,但我不知道如何实现。

rust rust-tracing

0
推荐指数
1
解决办法
590
查看次数

标签 统计

rust ×6

rust-tracing ×6

logging ×1

registry ×1

rust-tokio ×1

testing ×1

trace ×1