使用 tracing 库监控 Rust 应用程序

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 tracing,为什么需要它?

tracing 是一个用于 Rust 应用程序的强大的检测和监控框架。与简单的日志记录不同,tracing 提供关于程序执行的结构化数据,不仅可以跟踪消息,还可以跟踪上下文、跨度(span)和事件。这对于性能诊断、分布式系统和微服务特别有用。

主要功能

  • 跨度(spans): 跟踪操作执行的时间间隔(例如,处理 HTTP 请求)。
  • 事件(events): 带有上下文的点状日志(级别、字段、时间)。
  • 结构化数据: 支持键值对(key-value)字段,便于机器处理。
  • 异步支持: 与 tokio 和 async/await 完全兼容。
  • 过滤: 动态管理日志级别(trace, debug, info, warn, error)。

安装

在 Cargo.toml 中添加:

[dependencies]tracing = "0.1"tracing-subscriber = "0.3"

Rust 代码示例

use tracing::{info, span, Level};use tracing_subscriber::FmtSubscriber;

fn main() { // 初始化订阅者(输出到 stdout) let subscriber = FmtSubscriber::builder() .with_max_level(Level::TRACE) .finish(); tracing::subscriber::set_global_default(subscriber) .expect("无法设置全局订阅者");

// 为操作创建跨度 let span = span!(Level::INFO, "main_operation", user_id = 42); let _guard = span.enter();

// 记录事件 info!("开始处理请求");

// 嵌套跨度 let inner_span = span!(Level::DEBUG, "sub_task", task_id = "calc"); let _inner_guard = inner_span.enter(); tracing::event!(Level::TRACE, "执行子任务"); drop(_inner_guard);

info!("请求完成");}

终端输出(带时间戳和上下文):

2025-03-22T10:00:00.123Z INFO main_operation{user_id=42}: 开始处理请求2025-03-22T10:00:00.124Z TRACE main_operation{user_id=42}:sub_task{task_id="calc"}: 执行子任务2025-03-22T10:00:00.125Z INFO main_operation{user_id=42}: 请求完成

何时使用 tracing?

  • 微服务: 通过分布式跨度跟踪请求链(例如,使用 opentelemetry)。
  • 高负载系统: 替代标准日志记录以降低开销。
  • 异步代码调试: 跨度自动绑定到 tokio 任务。
  • 生产环境监控: 通过导出跟踪与 Grafana、Jaeger、Datadog 集成。

tracing 库是 Rust 生态系统中监控的事实标准。它被用于 tokio、hyper、actix-web 和 axum 等项目。

推荐