1个不稳定版本
0.3.6 | 2023年3月16日 |
---|
#830 在 调试
每月24次下载
225KB
425 代码行
tracing-bunyan-formatter
tokio-rs/tracing的Bunyan格式化
tracing-bunyan-formatter
提供了两个用于在 tracing
Subscriber
上使用的 Layer
实现来使用
JsonStorageLayer
,通过JsonStorage
和Span
的extensions
附加上下文信息,便于下游Layer
消费;BunyanFormattingLayer
,在进入span、退出span和创建事件时,输出一个兼容bunyan的格式化记录。
重要:每个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-subscriber
的Layer
trait之上构建通用框架的野心,但JsonStorageLayer
收集的信息可以通过其公共API被其他下游层利用,这些层位于此crate之外,主要关注格式化。如果您出于任何原因或目的需要实现自己的格式化器,这将大大降低您需要处理的复杂性。
您还可以在JsonStorageLayer
之后添加另一个富化层,以收集关于每个span的额外信息,并将其存储在JsonStorage
中。我们本可以使用这种组合方法来将elapsed_milliseconds
添加到每个span中,而不是将其嵌入到JsonStorage
本身中。
可选功能
您可以通过启用arbitrary_precision
功能来处理任意大小的数字。请注意,有关未标记反序列化的一个已知问题。
测试
目前测试只支持顺序执行,因此需要限制线程数量
cargo测试 ----test-threads 1
依赖项
~4MB
~68K SLoC