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");
}
结合场景再看三个关注点
- 库用 tracing/log,二进制选 subscriber
- 字段结构化 便于检索
- 敏感数据脱敏
核心概念
- level:error/warn/info/debug/trace
- span:请求范围上下文
- 与 OpenTelemetry 导出衔接
工程实践
- 统一 request_id
- 采样与级别可配置
- JSON 输出对接采集
- 错误带
error=%e或 source 链
本节总结
- 结构化日志/追踪
- 门面与实现分离
- 服务排障基础
自测题
- 库为什么不应初始化 global subscriber?
- span 有什么用?
参考答案
- 应用决定导出与格式。
- 关联一次请求内多个事件的上下文。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| tracing | 生态 | 诊断框架 |
| log | 生态 | 门面 |