#filter #events #tracing #filtering #next-generation #records #experimental

tracing-filter

实验性的下一代跟踪过滤支持

2个版本

0.1.0-alpha.22022年5月28日
0.1.0-alpha.12022年5月27日

#658调试

Download history 35/week @ 2024-03-13 31/week @ 2024-03-20 47/week @ 2024-03-27 34/week @ 2024-04-03 73/week @ 2024-04-10 18/week @ 2024-04-17 15/week @ 2024-04-24 10/week @ 2024-05-01 26/week @ 2024-05-08 20/week @ 2024-05-15 3/week @ 2024-05-22 3/week @ 2024-05-29 10/week @ 2024-06-05 14/week @ 2024-06-12 22/week @ 2024-06-19 32/week @ 2024-06-26

79 每月下载次数

MIT/Apache

96KB
2K SLoC

tracing-filter

结构化跟踪记录的过滤/查询系统。

仍在开发中。 功能状态各不相同

目前仅针对收集的事件进行过滤。然而,我 希望 也支持过滤记录的事件。

过滤器

当你构建一个 Filter 类型时,你确定它支持哪种类型的过滤器。你不能在一个过滤层中混合不同类型的过滤器。

请注意,复杂的过滤器可能会降低你的跟踪性能,因此通常不建议使用不受信任(即用户)来源的过滤器。这对于旧版和查询过滤器尤为重要;因为它们使用 regex-automata 来实现无缓冲的正则表达式过滤,因此容易受到无界正则表达式编译时间的影响,类似于 CVE-20222-24713。简单的过滤器不进行无缓冲的正则表达式评估,因此直接使用正则表达式crate,这已经缓解了这个问题。

简单过滤器

tracing-filter与env_logger的过滤器语法99.999%兼容。因此,你可以像以前一样编写简单的过滤器

  • warn — 过滤出级别为 WARNERROR 的事件
  • my_app=debug — 仅过滤出来自 my_appDEBUG 或更高级别的事件
  • warn,my_app::module=trace — 获取警告事件并跟踪 my_app::module
  • off — 禁用所有日志
  • debug/foo — 过滤出包含 "foo" 的 DEBUG 或更高级别的事件

通常,语法是 target=level/regex。如果一个事件的目标 列出的 target 开头,其级别通过了 level 过滤器,并且其消息与 regex 匹配,则该事件将被包含。使用 env_logger crate 时,如果不启用 regex 功能,正则表达式字符串是简单的子字符串匹配;使用我们简单的过滤器,

这应该在 tracing_filter::simple 模块中达到 99% 的功能性。

:tracing 还不允许根据事件字段的内容进行过滤 目前还不允许。tracing-filter 选择暂时静默忽略正则表达式过滤器(但确实验证了过滤器)。

旧版过滤器

[email protected]EnvFilter 支持的过滤器语法,包括其所有独特的 "peculiarites"(特性);100% 的 bug-for-bug 兼容。

因此,您可以继续使用所有之前使用的过滤器

  • warn — 过滤出级别为 WARNERROR 的事件
  • my_app=debug — 仅过滤出来自 my_appDEBUG 或更高级别的事件
  • warn,my_app::module=trace — 获取警告事件并跟踪 my_app::module
  • off — 禁用所有日志
  • [span]=debug — 在名为 span 的跨度内过滤 DEBUG 或更高的事件
  • [{field}] — 过滤具有字段 field 或在具有名称 field 的跨度内的事件
  • [{key=val}] — 过滤具有字段 key 且与正则表达式 val 匹配的事件
  • [{key=0}] — 过滤具有字段 key 且记录的数字等于 0
  • [{key=true}] — 过滤具有字段 key 且记录的布尔值为 true
  • target[span] — 过滤具有目标 target 和名称 span 的跨度内的事件

通常,语法是 target[span{field=value}]=level

这应该在 tracing_filter::legacy 模块中达到 100% 的功能性。

查询过滤器

查询过滤器是 tracing-filter 选择事件并利用 tracing 的结构化事件的途径。查询过滤器是简单过滤器的 99% 子集;具体来说,对于每个由 , 分隔的指令,如果它以 ( 开头,则它被视为查询过滤器;否则,它被视为简单过滤器。

这仍在进行设计工作。

为什么不使用 tracing-filter?

  • tracing-filter 非常实验性
  • tracing-filter 不受 tracing 团队官方支持
  • tracing-filter 未发布到 crates-io
  • tracing-filter 与未发布的 tracing 0.2.0 生态系统一起工作

为什么使用 tracing-filter?

  • [email protected]EnvFilter 更可配置
  • 您希望您的运行时过滤器语法能够适用于序列化事件查询
  • 您喜欢作者,并希望他们为自己感到骄傲
  • 我们有漂亮的由 miette 驱动的错误 😄

依赖项

~12MB
~208K SLoC