指出一个 FileBeat 官方文档里一个正则表达式的坑

2019-10-14 16:07:21 +08:00
 CivAx

文档地址:https://www.elastic.co/guide/en/beats/filebeat/6.3/_examples_of_multiline_configuration.html (对,我知道是旧文档,因为新文档里完全改写——实际上是缩写了这个页面)

在匹配 Java 堆栈报错日志的时候,官方文档建议的正则式是

正则式 ↓:

'^[[:space:]]+(at|\.{3})\b|^Caused by:'

那么按照文档,去 https://regex101.com/ 使用 Go 语言匹配模式测试一下

匹配文 ↓:(照顾页面美观缩短了一下)

        at org.mybatis.sping.invoke(SqlSessionTemplate.java:433) ~[mybatis-spring-1.3.2.jar!/:1.3.2]
        ... 89 more

测试结果: https://i.imgur.com/2JoxHXy.png

明显最后那行是没匹配上的。

变换着正则模式捣鼓了一小会儿(我正则几乎 0 基础,结论可能有错),疑似是 "..." 与它和 "89" 之间的空格同为符号(非单词),不能正确被 "\b" 识别与切割,因为去掉 "\b" 后,这条正则是可以工作的。

那么按照我的理解,这条正则的正确写法应该是 ↓:

^[[:space:]]+(at)\b|(\.{3})\B|^Caused by:

不过这么写,根据测试,匹配速度会在原公式的基础上慢到翻倍,因为要适配两个 Group。如果直接去掉 "\b" 的话匹配上看起来没问题,没有丢文本(不敢确定),速度也是正常速度。

1768 次点击
所在节点    程序员
4 条回复
airfling
2019-10-14 16:15:28 +08:00
一个是 java,一个是 go,不要这么说好不,不同语言解析的正则稍微有点差别
CivAx
2019-10-14 16:19:33 +08:00
@airfling #1 FileBeat 是 Golang 写的,所以我在 RegEx101 里用 Golang 模式来匹配;官方文档是针对 "Java stack traces" 拟的文档,请问我说的有什么问题。
Bromine0x23
2019-10-14 17:28:58 +08:00
示例应该是错的,不过正确写法应该是 `^[[:space:]]+(?:at\b|\.{3}\B)|^Caused by:` 吧

`^[[:space:]]+(at)\b|(\.{3})\B|^Caused by:` 实际上是三个子模式的并(`^[[:space:]]+(at)\b`、`(\.{3})\B`、`^Caused by:`)
CivAx
2019-10-14 17:43:16 +08:00
@Bromine0x23 #3 这个好快,比官方快 50% XD

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/609196

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX