Rust 的 Tracing:完整指南与示例

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

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

开始课程

什么是 Tracing,为什么在 Rust 中需要它?



Tracing 库是一个用于 Rust 语言应用程序的结构化日志记录和检测(追踪)的强大框架。与简单的日志记录器不同,Tracing 提供了跨度(spans)和事件(events)的概念,允许您在异步操作、分布式系统和复杂嵌套调用的上下文中跟踪代码的执行。



Tracing 的主要目标是让开发人员全面了解程序内部发生的情况:调用了哪些函数、它们执行了多长时间、出现了哪些错误以及它们之间如何关联。这是调试、性能分析和监控生产系统不可或缺的工具。



该库是 Tokio 生态系统的一部分,并积极用于诸如 actix-web、axum、hyper 等项目中。



安装 Tracing



要将 Tracing 添加到您的 Rust 项目中,请打开 Cargo.toml 文件并添加以下依赖项:



[dependencies]tracing = "0.1"tracing-subscriber = "0.3"  # 用于将日志输出到控制台tracing-appender = "0.2"    # 用于将日志写入文件(可选)


之后,运行 cargo build 命令以下载并编译这些库。



快速入门:第一个示例



让我们编写一个最简单的程序,使用 Tracing 记录一条消息:



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

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

// 记录一条简单消息 info!("应用程序已启动!");

// 调用带有追踪的函数 process_data("example.txt");}

fn process_data(filename: &str) { // 创建一个跨度(span)来跟踪函数 let span = tracing::span!(Level::INFO, "process_data", filename = filename); let _guard = span.enter(); // 进入跨度

info!("开始处理文件"); // ... 一些工作 ... std::thread::sleep(std::time::Duration::from_millis(100)); info!("处理完成");}


运行时,您将看到带有时间戳、级别和跨度名称的结构化输出。



Tracing 的主要方法和函数



以下是 Tracing 库的 10 个关键函数和宏,带有详细描述和示例。



1. tracing::span! — 创建跨度

功能: 创建一个新的跨度——一个逻辑工作单元,可以嵌套。跨度具有名称、级别和一组字段。

参数:

  • Level — 日志记录级别(ERROR, WARN, INFO, DEBUG, TRACE)
  • target(可选)— 标识模块的字符串
  • field = value — 用于上下文的任意字段

示例:

use tracing::Level;

fn handle_request(id: u64) { let span = tracing::span!(Level::INFO, "handle_request", request_id = id); let _guard = span.enter(); // 跨度内的代码 tracing::info!("正在处理请求");}


2. tracing::info! — 在 INFO 级别记录日志

功能: 记录一个 INFO 级别的事件。事件是一个单一消息,可以与当前跨度关联。

参数:

  • 格式化字符串(如 format! 中)
  • 用于格式化的参数
  • 通过 field = value 的字段

推荐