Rust 日志与 tracing

log facade 与 tracing 结构化诊断:跨服务相关字段、层级与生产习惯。

#type / concept #status / growing #tech / dev #resource / rust

[!info] 关联笔记

Rust 日志与 tracing

这个概念为什么出现

println! 不能当生产日志:无级别、难过滤、无关联字段。
生态常用 log 门面或 tracing 做结构化事件。

[!abstract] 一句话理解 用 tracing(或 log+实现)记录带字段的事件与跨度;在二进制入口安装 subscriber;库只打事件不绑死后端。

最小可运行示例

场景:请求处理打结构化事件

// 需 tracing / tracing-subscriber 依赖
/*
use tracing::{info, instrument};

#[instrument]
fn handle_order(order_id: u64) {
    info!(order_id, status = "paid", "order handled");
}

fn main() {
    tracing_subscriber::fmt::init();
    handle_order(42);
}
*/

fn main() {
    println!("order_id=42 status=paid msg=order handled");
}

结合场景再看三个关注点

  1. 库用 tracing/log,二进制选 subscriber
  2. 字段结构化 便于检索
  3. 敏感数据脱敏

核心概念

  • level:error/warn/info/debug/trace
  • span:请求范围上下文
  • 与 OpenTelemetry 导出衔接

工程实践

  1. 统一 request_id
  2. 采样与级别可配置
  3. JSON 输出对接采集
  4. 错误带 error=%e 或 source 链

本节总结

  • 结构化日志/追踪
  • 门面与实现分离
  • 服务排障基础

自测题

  1. 库为什么不应初始化 global subscriber?
  2. span 有什么用?
参考答案
  1. 应用决定导出与格式。
  2. 关联一次请求内多个事件的上下文。

延伸阅读与资料来源

资料类型支撑内容
tracing生态诊断框架
log生态门面
创建于 2026/7/15 更新于 2026/7/15