全景
这一部分不进细节,先把整张地图画出来:
- tracing 解决什么问题:两个请求在同一线程上交错执行时,
log的输出分不清哪行属于哪个请求,给 future 套上.instrument(span)后每行都带上请求 id,任务换了线程也不丢;字段带名字和类型;门面和实现分开这一点和log相同,两者逐项对比。 - 一条日志穿过 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。
💬 关联讨论
发起讨论加载中...