#tracing-subscriber #tracing #subscriber #logging #bunyan #metrics

tracing-bunyan-formatter-with-utc-offset

Bunyan格式化器,用于tracing包

1个不稳定版本

0.3.6 2023年3月16日

#830调试

每月24次下载

MIT/Apache

225KB
425 代码行

tracing-bunyan-formatter

tokio-rs/tracing的Bunyan格式化


tracing-bunyan-formatter 提供了两个用于在 tracing Subscriber 上使用的 Layer 实现来使用

重要:每个span都将继承其父span的所有字段和属性 - 这目前不是 tracing_subscriber::fmt::Layer 提供的行为。

示例

use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer, Config};
use tracing::instrument;
use tracing::info;
use tracing_subscriber::Registry;
use tracing_subscriber::layer::SubscriberExt;

#[instrument]
pub fn a_unit_of_work(first_parameter: u64) {
    for i in 0..2 {
        a_sub_unit_of_work(i);
    }
    info!(excited = "true", "Tracing is quite cool!");
}

#[instrument]
pub fn a_sub_unit_of_work(sub_parameter: u64) {
    info!("Events have the full context of their parent span!");
}

fn main() {
    // UTC offset
    let config = Config { offset: 1 };
    let formatting_layer = BunyanFormattingLayer::new("tracing_demo".into(), std::io::stdout, Some(config));
    let subscriber = Registry::default()
        .with(JsonStorageLayer)
        .with(formatting_layer);
    tracing::subscriber::set_global_default(subscriber).unwrap();

    info!("Orphan event without a parent span");
    a_unit_of_work(2);
}

控制台输出


如果你将输出传递到 bunyan CLI


实现策略

我们追求的分层方法可能不是最有效的,但它使分离不同关注点并跨多个 Layer 重复使用通用逻辑变得更容易。

尽管当前的这个crate没有提供在tracing-subscriberLayer trait之上构建通用框架的野心,但JsonStorageLayer收集的信息可以通过其公共API被其他下游层利用,这些层位于此crate之外,主要关注格式化。如果您出于任何原因或目的需要实现自己的格式化器,这将大大降低您需要处理的复杂性。

您还可以在JsonStorageLayer之后添加另一个富化层,以收集关于每个span的额外信息,并将其存储在JsonStorage中。我们本可以使用这种组合方法来将elapsed_milliseconds添加到每个span中,而不是将其嵌入到JsonStorage本身中。

可选功能

您可以通过启用arbitrary_precision功能来处理任意大小的数字。请注意,有关未标记反序列化的一个已知问题。

测试

目前测试只支持顺序执行,因此需要限制线程数量

cargo测试 ----test-threads 1

依赖项

~4MB
~68K SLoC