文档地址: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" 的话匹配上看起来没问题,没有丢文本(不敢确定),速度也是正常速度。
1
airfling 2019-10-14 16:15:28 +08:00
一个是 java,一个是 go,不要这么说好不,不同语言解析的正则稍微有点差别
|
2
CivAx OP @airfling #1 FileBeat 是 Golang 写的,所以我在 RegEx101 里用 Golang 模式来匹配;官方文档是针对 "Java stack traces" 拟的文档,请问我说的有什么问题。
|
3
Bromine0x23 2019-10-14 17:28:58 +08:00 1
示例应该是错的,不过正确写法应该是 `^[[:space:]]+(?:at\b|\.{3}\B)|^Caused by:` 吧
`^[[:space:]]+(at)\b|(\.{3})\B|^Caused by:` 实际上是三个子模式的并(`^[[:space:]]+(at)\b`、`(\.{3})\B`、`^Caused by:`) |
4
CivAx OP @Bromine0x23 #3 这个好快,比官方快 50% XD
|