Grok可以解析任何格式的文本,他是目前 logstash 中解析非结构化日志数据最好的方式,它可以从非结构化的日志中,解析出结构化的字段。
1、基本语法
Grok 的语法规则是:
%{语法 : 语义}
“语法”指的就是匹配的模式,例如使用 NUMBER 模式可以匹配出数字,IP 则会匹配出 127.0.0.1 这样的 IP 地址:
%{NUMBER:lasttime}%{IP:client}
默认情况下,所有“语义”都被保存成字符串,你也可以添加转换到的数据类型
%{NUMBER:lasttime:int}%{IP:client}
目前转换类型只支持 int 和 float
Logstash自带的匹配模式大概有70种,如USERNAME 、USER 、IPORHOST 、HOSTNAME等,可详见:
https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
2、自定义匹配模式
Logstash自带的匹配模式毕竟有限,在实际使用时,经常需要根据文件格式的需要,自定义匹配模式。
匹配模式其实就是按照某个正则表达式进行匹配,因此自定义匹配模式,就是自定义匹配的正则表达式。
2.1 配置文件中直接定义
直接使用oniguruma语法去匹配文本片段,语法如下:
(?<field_name>the pattern here)
假设你需要匹配的文本片段为一个长度为10或11的十六进制的值,使用下列语法可以获取该片段,并把值赋予queue_id:
(?<queue_id>[0-9A-F]{10,11})
2.2 定义pattern文件
创建文件夹patterns,在此文件夹下面创建一个文件,文件名随意,比如: postfix。
# contents of ./patterns/postfix:
POSTFIX_QUEUEID [0-9A-F]{10,11}
然后将patterns file引入,告诉logstash你的自定义类型文件,以下面的event log record为例子:
55.3.244.1 GET /index.html 15824 0.043 ABC24C98567
在logstash conf.d文件夹下面创建filter conf文件,内容如下:
filter {
grok {
patterns_dir => ["./patterns"]
match => {
"message" => "%{IP:client_id_address} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:http_response_time} %{POSTFIX_QUEUEID:queue_id}"
}
}
}
匹配结果如下:
client_id_address: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
http_response_time: 0.043
queue_id: ABC24C98567
推荐使用grokdebugger来写匹配模式,输入event log record,再逐步使用pattern微调切分,下方会根据你所写的模式将输入切分字段。