Rust in Everything
基于 tracing 0.1.44

全景

这一部分不进细节,先把整张地图画出来:

  1. tracing 解决什么问题:两个请求在同一线程上交错执行时,log 的输出分不清哪行属于哪个请求,给 future 套上 .instrument(span) 后每行都带上请求 id,任务换了线程也不丢;字段带名字和类型;门面和实现分开这一点和 log 相同,两者逐项对比。
  2. 一条日志穿过 tracing:一个 fmt().with_env_filter(...) 程序,外面包一层打印每个 Subscriber 回调的 subscriber,循环跑两遍:max_level_hint 只在 init 时问一次,register_callsite 只在第一次经过调用点时发生,enabled 一次没调,被级别挡住的 debug! 连调用点都不注册;一张时序图画出两条主线。
flowchart TB
  macros["info! 与 info_span!"] --> gates["级别门与调用点缓存"]
  gates --> disp["Dispatch"]
  disp --> layered["Layered:逐层分发"]
  layered --> reg["Registry:span 与线程栈"]
  layered --> fmtl["fmt Layer:写一行"]

后面每一部分都是在放大这张图的某一段:宏和门在 03,调用点与 Dispatch 在 02,Layered、Registry、fmt 在 05。

💬 关联讨论

发起讨论
加载中...