2 个不稳定版本

使用旧的 Rust 2015

0.1.0 2019 年 4 月 22 日
0.0.0 2017 年 11 月 27 日

#705调试

Download history 14/week @ 2024-03-11 21/week @ 2024-03-18 102/week @ 2024-04-01 19/week @ 2024-04-15 47/week @ 2024-04-22 41/week @ 2024-04-29 24/week @ 2024-05-06 2/week @ 2024-05-13 27/week @ 2024-05-27 35/week @ 2024-06-03 60/week @ 2024-06-10 22/week @ 2024-06-17 1/week @ 2024-06-24

120 每月下载量

MIT 许可证

195KB
3K SLoC

tokio-trace

一个范围化的、结构化日志和诊断系统。

文档

概述

tokio-trace 是一个用于收集结构化、事件驱动的诊断信息的 Rust 程序框架。

在像 Tokio 这样的异步系统中,解析传统的日志消息通常相当具有挑战性。由于单个任务在相同的线程上复用,相关的事件和日志行会混合在一起,使得难以跟踪逻辑流程。《code>tokio-trace 通过允许库和应用程序记录关于 时间因果关系 的额外信息的结构化事件,扩展了日志风格的诊断。与日志消息不同,tokio-trace 中的 span 有一个开始和结束时间,可以由执行流程进入和退出,并且可以存在于类似 span 的嵌套树中。此外,tokio-trace 中的 span 是 结构化 的,能够记录类型化数据以及文本消息。

tokio-trace 软件包提供了用于将库和应用程序仪器化的 API,以发出跟踪数据。

用法

首先,将以下内容添加到您的 Cargo.toml

[dependencies]
tokio-trace = "0.1"

然后,将以下内容添加到您的 crate

#[macro_use]
extern crate tokio_trace;

此 crate 提供了创建 SpanEvent 宏,分别代表程序执行中的时间段和瞬时事件。

一般来说,span 应用于表示离散的工作单元(例如,服务器中特定请求的生命周期)或花费在特定上下文中的时间段(例如,与外部系统实例(如数据库)交互的时间)。相比之下,event 应用于表示 span 内的时间点——例如,带有特定状态码的请求返回,队列中提取了 n 个新项目等。

Span 是通过使用 span! 宏来构建的,然后通过 进入 来表示一些代码发生在该 Span 的上下文中。

// Construct a new span named "my span".
let mut span = span!("my span");
span.enter(|| {
    // Any trace events in this closure or code called by it will occur within
    // the span.
});
// Dropping the span will close it, indicating that it has ended.

Event 类型代表一个瞬时发生的事件,本质上是一个无法进入的 Span。它们是通过使用 event! 宏来创建的。

use tokio_trace::Level;
event!(Level::INFO, "something has happened!");

使用 log 库的用户应该注意,tokio-trace 提供了一系列用于创建 Event 的宏(trace!debug!info!warn!error!),其语法与 log 库中同名宏的语法相同。通常,将项目转换为使用 tokio-trace 的过程可以从简单的替换开始。

让我们考虑 log 库的剃羊毛示例。

#[macro_use]
extern crate tokio_trace;
use tokio_trace::field;

pub fn shave_the_yak(yak: &mut Yak) {
    // Create a new span for this invocation of `shave_the_yak`, annotated
    // with  the yak being shaved as a *field* on the span.
    span!("shave_the_yak", yak = field::debug(&yak)).enter(|| {
        // Since the span is annotated with the yak, it is part of the context
        // for everything happening inside the span. Therefore, we don't need
        // to add it to the message for this event, as the `log` crate does.
        info!(target: "yak_events", "Commencing yak shaving");

        loop {
            match find_a_razor() {
                Ok(razor) => {
                    // We can add the razor as a field rather than formatting it
                    // as part of the message, allowing subscribers to consume it
                    // in a more structured manner:
                    info!({ razor = field::display(razor) }, "Razor located");
                    yak.shave(razor);
                    break;
                }
                Err(err) => {
                    // However, we can also create events with formatted messages,
                    // just as we would for log records.
                    warn!("Unable to locate a razor: {}, retrying", err);
                }
            }
        }
    })
}

您可以在示例目录中找到如何使用此库的示例。

在库中

库应仅链接到 tokio-trace 库,并使用提供的宏来记录对下游消费者有用的任何信息。

在可执行文件中

为了记录跟踪事件,可执行文件必须使用与 tokio-trace 兼容的 Subscriber 实现。一个 Subscriber 实现了一种收集跟踪数据的方式,例如将其记录到标准输出。

log 库不同,tokio-trace 不会使用一个全局的 Subscriber,该全局 Subscriber 只初始化一次。相反,它遵循 tokio 在上下文中执行代码的模式。例如

#[macro_use]
extern crate tokio_trace;

let my_subscriber = FooSubscriber::new();

tokio_trace::subscriber::with_default(subscriber, || {
    // Any trace events generated in this closure or by functions it calls
    // will be collected by `my_subscriber`.
})

这种方法允许跟踪数据由程序中不同上下文中的多个订阅者收集。或者,可以由 main 函数构建单个订阅者,所有后续代码都使用该订阅者作为默认执行。任何在订阅者上下文之外生成的跟踪事件都不会被收集。

可执行文件本身也可以使用 tokio-trace 库来自我监控。

tokio-trace-nursery 存储库包含一些不太稳定的库,这些库旨在与 tokio-trace 生态系统一起使用。它包括一系列 Subscriber 实现以及实用和适配器库。

许可证

本项目采用 MIT 许可证

贡献

除非您明确声明,否则您提交给 Tokio 的任何有意包含的贡献,都将按照 MIT 许可证授权,不附加任何额外条款或条件。

依赖项