-
原理介绍
- grok内置了一些常用正则的表达式,其在grok-pattern文件中;
- 你可以自己定义一些喜欢的正则表达式,用于匹配自己需求的内容:
例如:中国式的时间匹配2018/9/11 9:46:32
TIMESTAMP_CHS %{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}
在grok官网有相应的在线正则匹配测试,不过需要翻墙,地址是http://grokdebug.herokuapp.com/#
其中Add custom patterns 是自定义正则,如果grok表达式中包含自定义正则而网站又不知道你的自定义正则是什么意思,就会编译报错。
-
一行包含n个数据结果,取第m个匹配到的结果
案例:要匹配的内容str:{a=one,b=3},{a=two,b=4},{a=three,b=9},{a=four,b=10}
要匹配a=one,使用%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})即可。但若要挨个匹配各个a的值,需要挨个匹配:
(%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})){1} --> one
(%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})){2} --> two
(%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})){3} --> three
(%{DATA}a=(?<a>[a-zA-Z]+)(?>,|\})){4} --> four
这样做实际上是把一行匹配多个结果的问题,转化成了一条日志匹配多次取不同段数据的问题。
另外作者在实际测试过程中,发现了一个问题,就是匹配的内容str其中包括了大量的数据,其中包含了回车和换行,导致grok表达式匹配直接卡死,并最终未匹配到结果。究其原因,是%{DATA}和.*实际上都匹配不到回车和换行,按理说匹配不到应该直接返回null,但实际上却卡了很久,不知道是不是grok的一个bug,待研究源码再详细说这个问题