写在前面:logstash的插件有很多,即使filter的插件也有很多,因为生产马上要实践了,这边做一个归类总结
学习来源:官方文档
基本说明
官方的文档里面,主要讲了以下几个filter的作用。
首先,filter的定义是为了即时解析和转换您的数据
当数据从源传输到存储时,Logstash过滤器会解析每个事件,识别命名字段以构建结构,并将它们转换为汇聚在通用格式上,以便更轻松,更快速地进行分析和业务价值。
这边把他总结成下面四点
- 1.使用grok从非结构化数据中导出结构
- 2.从IP地址解密地理坐标
- 3.匿名化PII数据,完全排除敏感字段
- 4.简化整体处理,独立于数据源,格式或模式。
这边讲一下GROK,GEO IP,FINGERPRINT,DATE
这四个插件。
备注:以下说明大部分都为翻译,如有出错,敬请见谅
一、GROK
1.描述
Grok是一种很好的解析文本并构造它方法,它可以将非结构化日志数据解析为结构化和可查询的内容。
此工具非常适用于syslog日志,apache和其他Web服务器日志,mysql日志,以及通常为人类而非计算机使用而编写的任何日志格式。
Logstash默认提供约120种模式(解析日志的规则)。你可以在这里找到它们:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns。你可以轻松添加自己的。(见patterns_dir设定)
重要辅助工具: debug
2.基础知识
语法
grok模式的语法是 %{SYNTAX:SEMANTIC}
这SYNTAX是与您的文本匹配的模式的名称。例如,3.44将与NUMBER模式匹配,55.3.244.1将与IP模式匹配。
这SEMANTIC是您为匹配的文本提供的标识符。例如,3.44可能是事件的持续时间,因此您可以简单地调用它duration。此外,字符串55.3.244.1可以标识client 发出请求。
对于上面的示例,您的grok过滤器看起来像这样:
%{NUMBER:duration}%{IP:client}
默认情况下,所有语义都保存为字符串。如果您希望转换语义的数据类型,例如将字符串更改为整数,则使用目标数据类型将其后缀。例如%{NUMBER:num:int}
,它将num语义从字符串转换为整数。目前唯一支持的转化是int
和float
。
示例
通过语法和语义的概念,我们可以从示例日志中提取有用的字段,如虚构的http请求日志:
55.3.244.1 GET /index.html 15824 0.043
这种模式可能是:
%{IP:client}%{WORD:method}%{URIPATHPARAM:request}%{NUMBER:bytes}%{NUMBER:duration}
详细点的logstash的配置就是
input {
file {
path => "/var/log/http.log"
}
}
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
在grok过滤器之后,该事件将包含一些额外的字段:
- client: 55.3.244.1
- method: GET
- request: /index.html
- bytes: 15824
- duration: 0.043
3.正则表达式
首先,Grok位于正则表达式之上,因此任何正则表达式在grok中也是有效的。
正则表达式库是Oniguruma,您可以在Oniguruma站点上看到完整支持的regexp语法。
自定义模式
有时logstash没有您需要的模式。为此,您有几个选择。
1.首先,您可以使用Oniguruma语法进行命名捕获,它可以匹配一段文本并将其保存为字段:
(?<field_name>the pattern here)
例如,后缀日志具有queue id10或11个字符的十六进制值。我可以像这样轻松捕获:
(?<queue_id>[0-9A-F]{10,11})
2.或者,您可以创建自定义模式文件
- 创建一个名为patterns其中调用文件的目录extra (文件名无关紧要,但为自己命名有意义)
- 在该文件中,将您需要的模式写为模式名称,空格,然后是该模式的正则表达式。
例如:执行上面的postfix queue id示例
# contents of ./patterns/postfix:
POSTFIX_QUEUEID [0-9A-F]{