#tracing-subscriber #tracing #logging #tokio #async

tracing-forest

保留并发任务跟踪数据的上下文一致性

7个版本

0.1.6 2023年6月19日
0.1.5 2022年10月25日
0.1.4 2022年5月12日
0.1.3 2022年1月22日

#46 in 调试

Download history 3911/week @ 2024-03-14 4575/week @ 2024-03-21 4627/week @ 2024-03-28 3767/week @ 2024-04-04 3687/week @ 2024-04-11 3331/week @ 2024-04-18 4466/week @ 2024-04-25 4375/week @ 2024-05-02 4528/week @ 2024-05-09 4608/week @ 2024-05-16 5491/week @ 2024-05-23 5173/week @ 2024-05-30 5668/week @ 2024-06-06 6079/week @ 2024-06-13 6010/week @ 2024-06-20 4120/week @ 2024-06-27

22,942 每月下载量
用于 32 个crate(15个直接使用)

MIT 许可证

98KB
1.5K SLoC

tracing-forest

github-img crates-img docs-img

保留并发任务跟踪数据的上下文一致性。

概述

tracing 是一个框架,用于通过 Subscriber 特性来收集结构和异步感知的诊断信息。 tracing-subscriber crate 提供了将 Subscriber 组合在一起的工具。这个crate通过提供 ForestLayer,一个 Layer,在记录时保留并发任务跟踪数据的上下文一致性来扩展 tracing-subscriber

这个crate旨在用于运行许多非平凡且不重叠任务的程序,如服务器后端。与其他仅跟踪事件上下文的 Subscriber 不同,tracing-forest 在并行环境中写入日志时也保留了上下文一致性,使得读者可以轻松追踪同一任务的事件序列。

tracing-forest 适用于编写应用程序。

入门

最简单的方法是启用所有功能。通过将以下内容添加到你的 Cargo.toml 文件来实现

tracing-forest = { version = "0.1.6", features = ["full"] }

然后,将 tracing_forest::init 添加到你的主函数中

fn main() {
    tracing_forest::init();
    // ...
}

上下文一致性实例

类似于这个crate,tracing-tree crate 会收集和以树状结构写入跟踪数据。与这个crate不同,它不维护并行环境中的上下文一致性。

观察以下程序,它模拟了同时为多个客户端提供服务。

use tracing::info;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, Registry};
use tracing_tree::HierarchicalLayer;

#[tracing::instrument]
async fn conn(id: u32) {
    for i in 0..3 {
        some_expensive_operation().await;
        info!(id, "step {}", i);
    }
}

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    // Use a `tracing-tree` subscriber
    Registry::default()
        .with(HierarchicalLayer::default())
        .init();

    let connections: Vec<_> = (0..3)
        .map(|id| tokio::spawn(conn(id)))
        .collect();

    for conn in connections {
        conn.await.unwrap();
    }
}

tracing-tree 不适用于并发使用,这可以通过程序输出得到证明。

conn id=2
conn id=0
conn id=1
  23ms  INFO step 0, id=2
  84ms  INFO step 0, id=1
  94ms  INFO step 1, id=2
  118ms  INFO step 0, id=0
  130ms  INFO step 1, id=1
  193ms  INFO step 2, id=2

  217ms  INFO step 1, id=0
  301ms  INFO step 2, id=1

  326ms  INFO step 2, id=0

我们可以使用 tracing-forest 作为 tracing-tree 的直接替代品。

use tracing::info;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, Registry};
use tracing_forest::ForestLayer;

#[tracing::instrument]
async fn conn(id: u32) {
    // -- snip --
}

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    // Use a `tracing-forest` subscriber
    Registry::default()
        .with(ForestLayer::default())
        .init();

    // -- snip --
}

现在我们可以轻松追踪发生了什么。

INFO     conn [ 150µs | 100.00% ] id: 1
INFO     ┝━ i [info]: step 0 | id: 1
INFO     ┝━ i [info]: step 1 | id: 1
INFO     ┕━ i [info]: step 2 | id: 1
INFO     conn [ 343µs | 100.00% ] id: 0
INFO     ┝━ i [info]: step 0 | id: 0
INFO     ┝━ i [info]: step 1 | id: 0
INFO     ┕━ i [info]: step 2 | id: 0
INFO     conn [ 233µs | 100.00% ] id: 2
INFO     ┝━ i [info]: step 0 | id: 2
INFO     ┝━ i [info]: step 1 | id: 2
INFO     ┕━ i [info]: step 2 | id: 2

许可证

tracing-forest 是开源软件,遵循 MIT 许可证分发。

依赖关系

~1.5–4.5MB
~77K SLoC