什么是 tracing?
tracing 是一个用于 Rust 应用程序的结构化日志记录、性能分析和监控的强大框架。与简单的日志记录器(如 log)不同,tracing 允许创建带有上下文的层次化跨度 (span) 和事件 (event),非常适合跟踪请求、事务和异步操作。
为什么 Rust 需要监控?
Rust 应用程序通常用于对性能和稳定性要求极高的高负载系统。没有监控,您将无法:
- 追踪慢速请求
- 发现内存泄漏或恐慌
- 理解微服务为何崩溃
tracing 通过提供统一的 API 来收集指标、进行追踪和日志记录,解决了这个问题。
安装
在 Cargo.toml 中添加:
[dependencies]tracing = "0.1"tracing-subscriber = "0.3"tracing-appender = "0.2"对于高级监控(OpenTelemetry),请使用 tracing-opentelemetry。
主要功能
- 跨度 (spans) — 带有上下文的时段(例如,处理 HTTP 请求)。
- 事件 (events) — 时间点(例如,错误或警告)。
- 结构化字段 — 以 key=value 格式传递数据。
- 异步支持 — 与
tokio/async-std正确协作。 - 导出到 OpenTelemetry — 与 Jaeger、Prometheus、Grafana 集成。
Rust 代码示例
use tracing::{info, error, span, Level};use tracing_subscriber;
fn main() { // 初始化日志记录器 tracing_subscriber::fmt() .with_env_filter("my_app=info") .init();
// 创建跨度(例如,用于 HTTP 请求) let root = span!(Level::INFO, "request", method = "GET", path = "/api/users"); let _guard = root.enter();
// 带上下文的日志记录 info!(user_id = 42, "处理请求"); // 带字段的错误 error!( error_code = 500, message = "服务器内部错误", "获取数据时出错" );
// 当 _guard 被丢弃时自动退出跨度}何时使用?
- Rust 微服务 — 追踪服务间的请求。
- 高负载 API — 寻找性能瓶颈。
- 异步应用程序 — 在
tokio中正确记录日志。 - 实时系统 — 监控延迟。
tracing 是 Rust 生态系统中监控的事实标准。它被用于 Tokio、Actix-web 和 Warp 等项目。