概述
logstash 之所以强大和流行,与其丰富的过滤器插件是分不开的
过滤器提供的并不单单是过滤的功能,还可以对进入过滤器的原始数据进行复杂的逻辑处理,甚至添加独特的新事件到后续流程中
强大的文本解析工具 -- Grok
grok 是一个十分强大的 logstash filter 插件,他可以解析任何格式的文本,他是目前 logstash 中解析非结构化日志数据最好的方式
基本用法
Grok 的语法规则是:
%{语法 : 语义}
“语法”指的就是匹配的模式,例如使用 NUMBER 模式可以匹配出数字,IP 则会匹配出 127.0.0.1 这样的 IP 地址:
%{NUMBER:lasttime}%{IP:client}
默认情况下,所有“语义”都被保存成字符串,你也可以添加转换到的数据类型
%{NUMBER:lasttime:int}%{IP:client}
目前转换类型只支持 int 和 float
覆盖 -- overwrite
使用 Grok 的 overwrite 参数也可以覆盖日志中的信息
filter { grok { match => { "message" => "%{SYSLOGBASE} %{DATA:message}" } overwrite => [ "message" ] } }
日志中的 message 字段将会被覆盖
示例
对于下面的log,事实上是一个 HTTP 请求行:
55.3.244.1 GET /index.html 15824 0.043
我们可以使用下面的 logstash 配置:
input { file { path => "/var/log/http.log" } } filter { grok { match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } } }
可以看到收集结果:
client: 55.3.244.1 method: GET request: /index.html bytes: 15824 duration: 0.043
将无结构的数据通过这样的方式实现了结构化输出
Grok 使用正则表达式
grok 是在正则表达式的基础上实现的(使用 Oniguruma 库),因此他可以解析任何正则表达式
创建模式
提取日志字段和正则表达式提取字段的规则一样:
(?<field_name>the pattern here)
首先,创建一个模式文件,写入你需要的正则表达式:
# contents of ./patterns/postfix: POSTFIX_QUEUEID [0-9A-F]{10,11}
然后配置你的 Logstash:
filter { grok { patterns_dir => "./patterns" match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" } } }