资讯动态

tracing 0.1.44 版本演进全解析:从 CHANGELOG 看 Rust 结构化追踪库六年迭代之路

发布时间:2026/10/15 17:50:54 来源:尧图企业网站定制
可观测性开发工具【免费下载链接】tracingApplication level tracing for Rust.项目地址https://gitcode.com/gh_mirrors/tr/tracing点击查看免费下载tracing是 Rust 生态中面向应用程序级结构化诊断structured diagnostics的核心库用于在程序运行时记录带结构化字段的 span 与 event并交给Subscriber订阅者统一处理。本文以 tracing/CHANGELOG.md 为骨架完整梳理从 0.1.02019 年 6 月到 0.1.442025 年 12 月的全部版本变更并结合 tracing/src 源码与 tracing/tests 测试用例逐项讲解新增 API、宏行为、性能优化与踩坑修复。读完本文你将能按版本脉络理解tracing的能力边界、record_all!/enabled!等新宏的正确用法、#[instrument]的属性演进以及升级到 0.1.42 时必须注意的破坏性变更。一、tracing 0.1.44最近一次发布2025-12-180.1.44 是一次小版本维护发布核心内容包括Fixed修复record_all在特定场景下的 panicPR [#3432]Changedtracing-core依赖更新至 0.1.36PR [#3440]。从源码看Span::record_all位于 tracing/src/span.rs#L1227是一个#[doc(hidden)]方法接受field::ValueSet_并构造Record下发给 subscriber。0.1.44 修复的正是该方法及其配套valueset_all!宏在极端输入下的稳定性问题。二、0.1.42 与 0.1.43一次被 yank 的破坏性变更与回滚这一组版本是升级时需要重点关注的事故现场0.1.432025-11-28明确标注 Important前一版本0.1.42 已被 yank撤回原因是 PR [#3382]makevaluesetmacro sanitary让valueset宏满足 hygiene 卫生性实际上是一个破坏性变更。0.1.43 保留了 0.1.42 中所有正常变更同时回滚了该 PR 中引发问题的那部分PR [#3425] Revert makevaluesetmacro sanitary。0.1.422025-11-26本身Span::record_all方法被移出公开文档化 API——它此前一直依赖ValueSet而ValueSet没有公开构造函数因此通过公开 API 根本不可用。该方法至今仍保留在源码中tracing/src/span.rs#L1227但只允许在tracing宏内部使用。0.1.42 新增内容record_all!宏PR [#3227]一次调用为多个字段记录新值。其定义位于 tracing/src/macros.rs#L152展开为$span.record_all($crate::valueset!(meta.fields(), ...))。官方 doc 示例# use tracing::{field, info_span, record_all}; let span info_span!(my span, field1 field::Empty, field2 field::Empty, field3 field::Empty).entered(); record_all!(span, field1 ?1, field2 %2, field3 3);其中?表示按fmt::Debug记录、%表示按fmt::Display记录普通表达式按类型化值记录。对应测试见 tracing/tests/span.rs#L622record_all_macro_records_new_values_for_fields它先创建含bar 1、baz 2、qux Empty、quux Empty的 span再record_all!(span, bar 5, qux %qux, quux ?QuuX, unknown unknown)并断言 subscriber 收到bar 5、qux display(qux)、quux debug(QuuX)的记录而未在 span 中声明的unknown字段会被静默忽略。attributes支持常量表达式作为#[instrument]的字段名PR [#3158]例如字段名可由const字符串给出而非必须为字面量标识符。core显著改善 trace 点的代码生成PR [#3398]减少宏展开后的冗余代码降低编译产物体积。0.1.42 修复清单修复event!的 name / parent 变体PR [#2983]移除原始标识符raw identifier字段名中的r#前缀PR [#3130]修复未设置release_max_level_*时的性能回退PR [#3373]使用导入路径替代全限定路径缩小展开代码PR [#3374]使valueset宏满足卫生性PR [#3382]后于 0.1.43 部分回滚。三、0.1.41 与 0.1.40字段索引 API 与一次 use-after-free 修复0.1.412024-11-27依赖升级tracing-core→ 0.1.33tracing-attributes→ 0.1.28MSRV 提升至 Rust 1.63PR [#2793]core为Field新增索引 APIPR [#2820]可按索引访问 span/event 的字段元数据core允许将[u8]记录为 event/span 字段值PR [#2954]core尽可能使用 constthread_local!PR [#2838]attributes支持target与name使用 const 值PR [#2941]宏内移除 core 导入、修复字段前缀缺失PR [#2762]、[#2878]、修复事件宏首位置使用常量字段名PR [#2883]等一批编译期问题。0.1.402023-10-19高危修复Instrument::into_inner存在潜在栈 use-after-free此前用mem::forget丢弃包装对象现改为mem::ManuallyDropPR [#2765]。对应实现见 tracing/src/instrument.rs#L369将self移入ManuallyDrop后用裸指针分别取出内部类型与 span避免Drop重复执行。该 bug 仅影响使用into_inner的代码。四、0.1.39宏能力增强与文档生态扩充2023-10-12允许在宏中使用常量字段名PR [#2617]允许在宏中设置事件event名称PR [#2699]core允许任意长度的ValueSetPR [#2508]打破此前 32 字段的隐含上限attributes 最低 proc-macro2 版本提升到 1.0.60PR [#2732]并减少 async 块返回类型推断产生的死代码PR [#2709]宏展开中的标识符改为全限定名避免与 std prelude 冲突PR [#2621]、[#2757]文档侧新增axum-insights、clippy-tracing、tracing-cloudwatch等关联 crate 列表。五、0.1.38Drop 语义与#[instrument]的 level 覆盖2023-04-250.1.38 是一次行为改进明显的发布Instrumentedfuture 在Drop时进入其绑定的 spanPR [#2562]这意味着 future 的Drop实现中发出的事件现在会被记录在该 span 作用域内。源码实现在 tracing/src/instrument.rs#L274PinnedDrop先this.span.enter()再ManuallyDrop::drop正是为了在Drop期间保持 span 进入状态。event!宏展开所调用方法补充#[inline]注解PR [#2555]同时改善二进制体积与性能attributes#[instrument(err)]与#[instrument(ret)]新增level参数PR [#2335]可覆盖生成的返回值事件级别例如#[instrument(err(level warn))]attributes#[instrument]加到const fn上时输出更友好的编译错误PR [#2418]syn依赖升级到 2.xPR [#2516]。六、0.1.37on_register_dispatch与WeakDispatch2022-10-06core新增Subscriber::on_register_dispatch方法PR [#2269]允许订阅者在被注册为Dispatch之后执行迟到初始化core新增WeakDispatch类型与Dispatch::downgrade()PR [#2293]可弱引用全局 dispatcher 而不会阻止其释放修复#[instrument]对内层属性的错误处理PR [#2307]、async fn 类型错误诊断位置不准确PR [#2270]、-Z minimal-versions下因syn导致编译失败PR [#2246]、valueset!宏展开的bare_trait_objects警告PR [#2308]。七、0.1.360.1.31性能优化与宏修复期2022 上半年0.1.362022-07-29Span::record支持自有值owned values与胖指针fat pointersPR [#2212]并修正dispatcher::set_default的错误文档PR [#2220]。0.1.352022-06-08使用新的DefaultCallsite显著降低 callsite 注册开销PR [#2083]。DefaultCallsite正是 tracing/src/macros.rs#L1218 中enabled!展开使用的静态 callsite 类型。0.1.342022-04-14修复线程先设置局部默认 dispatcher、后设置全局默认时全局默认 dispatcher 失效的问题PR [#2065]修复启用logfeature 时 async 块/fn future 变为!Send的编译错误PR [#2073]。0.1.332022-04-09新增span_enabled!与event_enabled!宏PR [#1900]用于单独测试 subscriber 是否会启用某个 span 或 event修复 ≤32 位目标含 wasm32下的编译警告PR [#2060]。0.1.322022-03-08显著降低被禁用 span 的创建与Drop开销PR [#1974]当没有 subscriber 或 span 被过滤器禁用时性能更好。0.1.312022-02-17MSRV 提升至 1.49.0PR [#1913]修复warn!宏误生成 TRACE 级别事件的问题PR [#1930]真正修复自定义concat!宏环境下的宏卫生问题PR [#1918]。八、0.1.30valuable实验支持与enabled!宏2022-02-030.1.30 引入两项重要能力field实验性支持用valuablecrate 记录结构化字段值PR [#1608]、[#1888]、[#1887]。这是 unstable 特性编译时必须传入--cfg tracing_unstable。tracing的Valuetrait 刻意保持极简只支持少量原生类型而valuable通过Valuabletrait 提供面向对象的结构化值检视在valuablefeature 开启时Visittrait 会附带可选record_value方法未实现时valuable::Value会回退到record_debug见 tracing/src/field.rs 模块文档。启用方式RUSTFLAGS--cfg tracing_unstable cargo build或在项目.cargo/config中配置[build] rustflags [--cfg, tracing_unstable]。enabled!宏PR [#1882]判断某个 span/event 在当前 subscriber 下是否会启用。其内部实现tracing/src/macros.rs#L1214先检查level_enabled!($lvl)再取静态DefaultCallsite的 interest 并调用__is_enabled——与span!/event!的启用判断完全一致因此可安全用于构造开销昂贵字段前先探测是否启用的优化模式if tracing::event_enabled!(tracing::Level::DEBUG, target: my_app, key %expensive_to_compute()) { tracing::debug!(target: my_app, key %expensive_to_compute()); }配套的启用检查宏家族span_enabled!/event_enabled!0.1.33 新增enabled!的专用变体分别固定Kind::SPAN与Kind::EVENTtracing/src/macros.rs#L1083、tracing/src/macros.rs#L1117。九、0.1.290.1.24Option 字段、Drop 期进入与错误记录2021 下半年0.1.292021-10-05OptionT where T: Value可作为类型化字段值记录PR [#1585]#[instrument]在生成的 span 被max_level禁用时性能大幅提升PR [#1600][#1617]修复WithSubscriber缺少Future实现导致WithDispatch扩展 trait 实际不可用的问题PR [#1602]。0.1.272021-09-13新增Span::or_current方法PR [#1538]用于高效地向新线程/任务传播 span 上下文——若 span 被禁用则回退到当前 span。源码见 tracing/src/span.rs#L1041if self.is_disabled() { return Self::current(); }。结合Instrument使用tracing/src/instrument.rs#L45tokio::spawn(my_future.instrument(tracing::debug_span!(my_future).or_current()));这样即使my_futurespan 被禁用spawn 的任务仍会落在外层 span 作用域内。attributes新增skip_all选项PR [#1548]一键跳过#[instrument]函数的所有参数原始类型按类型化值而非fmt::Debug记录PR [#1378]core 新增NoSubscriberno-op 实现PR [#1549]、Visit::record_f64浮点支持PR [#1507]、[#1522]。0.1.262021-04-30Boxdyn Subscriber Send Sync与Arc...的Subscriber实现PR [#1358]、[#1374]FromEnteredSpanforOptionId允许EnteredSpan出现在span!的parent:字段PR [#1325]Attributes::fields访问器PR [#1331]。0.1.252021-02-23Span::enteredPR [#1252]按值进入 span 并移动进 guardEnteredSpan与借用式Span::enter返回Entered_互补。两个方法源码相邻enter见 tracing/src/span.rs#L800entered见 tracing/src/span.rs#L910。0.1.242021-02-17修复#[instrument(err)]用于返回impl Trait的函数时的编译错误PR [#1236]与事件宏的坏 match 分支PR [#1239]。十、0.1.230.1.13#[instrument]能力扩展与 log 兼容2020-20210.1.232021-02-04修复#[instrument(err)]用于可变参数函数的编译错误PR [#1167]、async-trait 下缺失可见性修饰符PR [#977]tracing宏不再为被logcrate 的static_max_level_XXX静态禁用的级别生成代码PR [#1175]。0.1.212020-09-28引入Instrumenttrait 与Instrumented类型PR [#808]可把 span 附加到 future 上Level与LevelFilter实现CopyPR [#992]修复Span::new系列方法错误内联导致dispatcher::get_default被内联到 callsite 的问题PR [#994]。0.1.202020-08-24宏调用生成的汇编代码显著减少PR [#943]并正式文档化 MSRV 政策。0.1.192020-08-10修复全局 max level 过滤器计算错误PR [#908]#[instrument]支持在 async-trait 函数字段表达式中使用selfPR [#875]。0.1.182020-07-31修复LevelFilter::OFF及static_max_level_offfeature会启用全部而非零条 trace 的严重 bugPR [#853]宏展开检查顺序改为静态 max level → 全局LevelFilter::current()→ per-callsite 缓存大幅提升禁用场景性能LevelFilter改为tracing_core::LevelFilter的再导出可与tracing-core/tracing-subscriber版本互换使用新增LevelFilter::current()与Subscriber::max_level_hint可选方法。0.1.172020-07-22logfeature 下 span 进出记录移到tracing::span::activetarget可独立过滤PR [#833]。0.1.162020-07-08#[instrument]支持任意表达式作字段PR [#672]并对无法识别的输入发出编译警告修复宏过度单态化导致编译变慢的问题PR [#787]。0.1.152020-06-02宏改用$crate::取代遗留的local_inner_macrosPR [#740]。0.1.142020-05-14log兼容 feature 下 span 日志记录包含 span IDPR [#613]#[instrument]支持async-traittrait 实现中的方法PR [#711]新增可选#[instrument(err)]参数函数返回Err时自动发出事件PR [#637]subscriber::set_default返回 guard 增加#[must_use]PR [#685]。0.1.132019-02-26field::Empty类型用于声明后续再记录值的空字段PR [#548]Wrapping/NonZero*数值的Value实现PR [#538]#[instrument]支持为生成 span 添加任意字面量字段PR [#569]#[instrument]在尝试跳过函数参数时输出友好编译错误PR [#600]#[instrument]移入默认开启的attributesfeaturePR [#603]。十一、0.1.120.1.0API 奠基期20190.1.122019-01-11Span::with_subscriberPR [#503]API 文档标注各条目所需 feature。0.1.112019-12-20Span::is_none、LevelFilter::into_level、LevelFilter::from_level与FromLevel修复Span::follows_from参数类型错误导致无法调用的问题PR [#467]。0.1.102019-10-23#[instrument]支持参数解构、自动为self生成字段、可选skip参数跳过特定参数PR [#397]、[#359]新增dispatcher::set_default与subscriber::set_default返回 drop guardPR [#388]。0.1.92019-09-13#[instrument]支持异步函数随 nightly 更新修复PR [#342]无 subscriber 时被跳过 span/event 的性能影响显著降低PR [#326]新增log-alwaysfeature即使存在 subscriber 也始终输出 log 记录PR [#346]#[instrument]支持覆盖生成 span 的名称PR [#330]。0.1.82019-09-03重构并改进 API 文档。0.1.72019-08-30新的事件消息语法——消息置于第一个字段非花括号格式即今日tracing::info!(message {}, x)的形态PR [#309]修复logfeature 下的宏栈耗尽回归PR [#304]。0.1.62019-08-20std::error::Error成为新原生字段类型PR [#277]支持无花括号分隔的 key-value 字段与format_args消息混用PR [#288]。0.1.52019-08-09支持no-stdliballocPR [#263]async fn 上的#[instrument]不再需要 feature flagPR [#258]#[instrument]可用于泛型函数PR [#262]。0.1.42019-08-08引入#[instrument]属性宏自动为函数添加 spanPR [#253]。0.1.32019-07-11logfeature 下subscriber 指示 span 关闭时输出日志PR [#180]修复单字段局部变量简写导致的无限递归PR [#166]。0.1.22019-07-06Span::none()无需 metadata 的空 spanPR [#147]与Span::current()返回当前 spanPR [#148]。0.1.12019-07-03修复logfeature 下的编译错误PR [#131]。0.1.02019-06-27初始发布。十二、升级与版本选择实操建议结合 tracing/Cargo.toml当前version 0.1.44MSRV 声明为rust-version 1.65.0但注意 CHANGELOG 中 0.1.41 将 MSRV 定为 1.63后续版本实际要求以发布说明为准给出如下建议避开被 yank 的 0.1.42若锁定在 0.1.42 附近请升级到 0.1.43 或 0.1.44Cargo.lock中残留 0.1.42 时建议执行cargo update -p tracing。不要直接调用Span::record_all它已移出公开文档化 API如需批量更新字段请用record_all!宏tracing/src/macros.rs#L152这是社区推荐的唯一入口。启用高性能宏检查若想避免为被禁用的 span/event 构造昂贵字段先用span_enabled!/event_enabled!/enabled!探测0.1.30/0.1.33 起可用0.1.18 起宏已按静态级别 → 全局级别 → callsite 缓存顺序短路绝大多数场景无需手写探测。实验功能需显式开启valuable支持是 unstable 特性必须RUSTFLAGS--cfg tracing_unstable编译且 API 可能在 0.1.x 内变动。MSRV 演进0.1.31 → 1.49.00.1.41 → 1.63.0如需兼容旧工具链请按此对照选择版本。log 兼容场景log-always0.1.9 起可在有 subscriber 时也输出 log 记录0.1.17 起 span 生命周期日志移到tracing::span::activetarget 便于独立过滤。结语从 2019 年的 0.1.0 到 2025 年的 0.1.44tracing的 CHANGELOG 本身就是一部 Rust 结构化诊断最佳实践的演进史宏卫生性、编译期静态级别短路、disabled span 零开销、Drop 期 span 进入、valuable结构化值、#[instrument]的 err/ret/level/skip_all 参数……每一行变更都可以在 tracing/src 源码与 tracing/tests 测试中找到对应实现。希望本文能成为你选择版本、升级迁移与理解内部机制时的速查手册。附录本仓库中的配套资料核心 crate 源码tracing/src宏、span、field、dispatcher、instrument宏与调用方测试tracing/tests/span.rs、tracing/tests/macros.rs属性宏实现tracing-attributes/src/expand.rs、tracing-attributes/src/attr.rs底层订阅者接口tracing-core/src/subscriber.rs、tracing-core/src/callsite.rs官方示例examples含#[instrument]、tower、tokio、valuable等用法赞分享可观测性开发工具【免费下载链接】tracingApplication level tracing for Rust.项目地址https://gitcode.com/gh_mirrors/tr/tracing点击查看免费下载相关推荐RobotJS 版本演进全解析从 CHANGELOG 看 Node.js 桌面自动化库的跨平台迭代之路RobotJS 版本演进全解析从 CHANGELOG 看 Node.js 桌面自动化库的跨平台迭代之路 CHANGELOG.md 记录了 robotjs 从GUI 自动化桌面应用RPAOSMnx 版本演进全解析从 CHANGELOG 看 OpenStreetMap 路网分析工具链的十年迭代OSMnx 版本演进全解析从 CHANGELOG 看 OpenStreetMap 路网分析工具链的十年迭代 导读 本文以当前仓库 osmnx/CHANGELGIS数据分析数据可视化Foreman 版本演进全解析从 Changelog 看 Procfile 进程管理器的十年迭代Foreman 版本演进全解析从 Changelog 看 Procfile 进程管理器的十年迭代 Foreman 是一款用于管理 Procfile 型应用进程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑