24次发布

0.3.9 2023年8月15日
0.3.8 2023年7月16日
0.3.7 2023年3月31日
0.3.4 2022年10月10日
0.1.6 2020年5月12日

#23 in 调试

Download history 34289/week @ 2024-04-08 35104/week @ 2024-04-15 39796/week @ 2024-04-22 44190/week @ 2024-04-29 44501/week @ 2024-05-06 47235/week @ 2024-05-13 42345/week @ 2024-05-20 41090/week @ 2024-05-27 45555/week @ 2024-06-03 43990/week @ 2024-06-10 49974/week @ 2024-06-17 51853/week @ 2024-06-24 41710/week @ 2024-07-01 43716/week @ 2024-07-08 40941/week @ 2024-07-15 40873/week @ 2024-07-22

168,884 每月下载量
用于 53 个crates (45直接)

MIT/Apache

225KB
403

tracing-bunyan-formatter

tokio-rs/tracing的Bunyan格式化


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

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

示例

use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
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() {
    let formatting_layer = BunyanFormattingLayer::new("tracing_demo".into(), std::io::stdout);
    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)管道输出


作为一个纯 Rust 的替代方案,您可以查看 bunyan crate。它包括一个具有与原始 bunyan CLI 相似功能的 CLI 二进制文件,后者是用 JavaScript 编写的。

实现策略

我们追求的分层方法并不一定是最高效的,但它使得分离不同的关注点以及在不同 Layer 之间重用常见逻辑变得更加容易。

虽然当前 crate 并没有野心在 tracing-subscriberLayer 特性之上提供一个通用框架,但通过其公开 API,可以借助 JsonStorageLayer 收集的信息,其他下游层可以使用它进行格式化,而这些层可能并不在这个 crate 内部。这显著降低了您在实现自己的格式化器时需要处理的复杂性,无论出于什么原因或目的。

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

可选特性

您可以通过启用 arbitrary_precision 特性来处理任意大小的数字,而不会丢失信息。请注意 已知问题与未标记的反序列化

有价值的

tracing crate 有一个不稳定的特性 valuable,用于启用记录自定义复合类型,如 structs 和 enums。自定义类型必须实现 valuable crateValuable 特性,该特性可以通过宏推导。

要使用 tracingtracing-bunyan-formattervaluable,您必须在您的二进制文件中设置以下配置(截至 2023-03-29 的当前 crate 版本)

  1. tracing 依赖项启用特性标志 valuable

  2. --cfg tracing_unstable 参数添加到您的 rustc 标志中(请参阅 tracing 的文档)。这可以通过几种方式完成

    1. 将参数添加到您的二进制包的 .cargo/config.toml 中的 build.rustflags 下。请参阅 cargo 配置参考文档)。

      示例

      [build]
      rustflags = "--cfg tracing_unstable"
      
    2. 在运行 cargo 时将参数添加到 RUSTFLAGS 环境变量中。请参阅 cargo 环境变量文档)。

      示例

      RUSTFLAGS="--cfg tracing_unstable" cargo build
      
  3. tracing-bunyan-formatter 依赖项启用特性标志 valuable

  4. 添加依赖 valuable

  5. 可选:如果您想为您自定义类型推导出 Valuable 特性,请为 valuable 依赖项启用功能标志 derive

更多详细信息请参阅示例 examples/valuable.rs

测试

只需运行 cargo test

要启用 valuable 功能并运行额外测试,请运行

RUSTFLAGS='--cfg tracing_unstable' \
cargo test --target-dir target/debug_valuable --features "valuable valuable/derive"

RUSTFLAGS='--cfg tracing_unstable' \
cargo run --example valuable --target-dir target/debug_valuable --features "valuable valuable/derive"

依赖项

~3.5–4.5MB
~72K SLoC