logstash拥有丰富的filter插件,它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的 logstash 事件到后续的流程中去!Grok 是 Logstash 最重要的插件之一。也是迄今为止使蹩脚的、无结构的日志结构化和可查询的最好方式。Grok在解析 syslog logs、apache and other webserver logs、mysql logs等任意格式的文件上表现完美。
使用grok前注意
grok 模式是正则表达式,因此这个插件的性能受到正则表达式引擎严重影响。尽管知道 grok 模式与日志条目可以多快匹配非常重要,但是了解它在什么时候匹配失败也很重要。匹配成功和匹配失败的性能可能会差异很大。
grok基础
grok模式的语法如下:
%{SYNTAX:SEMANTIC}
1
SYNTAX:代表匹配值的类型,例如3.44可以用NUMBER类型所匹配,127.0.0.1可以使用IP类型匹配。
SEMANTIC:代表存储该值的一个变量名称,例如 3.44 可能是一个事件的持续时间,127.0.0.1可能是请求的client地址。所以这两个值可以用 %{NUMBER:duration} %{IP:client} 来匹配。
你也可以选择将数据类型转换添加到Grok模式。默认情况下,所有语义都保存为字符串。如果您希望转换语义的数据类型,例如将字符串更改为整数,则将其后缀为目标数据类型。例如%{NUMBER:num:int}将num语义从一个字符串转换为一个整数。目前唯一支持的转换是int和float。
例子: 通过这种语法和语义的思想,我们可以从一个示例日志中抽出有用的字段,就像这个虚构的http请求日志:
55.3.244.1 GET /index.html 15824 0.043
可以使用如下grok pattern来匹配这种记录:
%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
我们在logstash.conf中添加过滤器配置:
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
以下是filter结果:
● client: 55.3.244.1
● method: GET
● request: /index.html
● bytes: 15824
● duration: 0.043
正则表达式
Grok位于正则表达式之上,所以任何正则表达式在grok中都是有效的。正则表达式库是Oniguruma,您可以在Oniguruma网站上看到完整支持的regexp语法。
自定义类型
更多时候logstash grok没办法提供你所需要的匹配类型,这个时候我们可以使