8.1、grok正则过滤器配置
8.1.1、简介
grok用于将任意的文本进行结构化处理。 grok是目前logstash中将混乱的非结构日子数据,进行结构化的最好方式。 用这个工具来解析syslog日志,apache或其他webserver日志,mysql日志的效果非常好。通常来说,只要这个日志是给人员阅读的而不是给机器处理的日志,不管什么格式Grok都适用。
Logstash定义120多种默认的模式,可以在github上找到详细的信息:
https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
当然你也可以添加属于你自己的模式。 如果你在创建模式匹配自己的日志时需要帮助,可以访问http://grokdebug.herokuapp.com 和 http://grokconstructor.appspot.com/ 里的帮助信息。
8.1.2、grok基础
Grok通过文本模式来匹配你的log grok模式的语法是:%{SYNTAX:SEMANTIC} SANTAX是用于匹配目标文本的模式的名称。例如,3.44对应的模式是NUMBER;55.3.244.1对应的模式是IP。syntax用来描述如何匹配。
SEMANTIC 用来标识被匹配的文本片段,如:3.44是时间的间隔时间,可以简称为duration,进一步的,字符串55.3.244.1 或许可以用来标志正在发起请求的客户端,可以简称为client。
对于上边的例子,你的grok过滤器可以编写成这样:
%{NUMBER:duration} %{IP:client}
你可以随意的给你的grok模式增加数据转换类型。默认的所有的语义(semantics)都以字符串形式保存。如果你愿意转换semantic的数据类型,例如将字符串型转换成整型,可以通过添加标识目标数据类型的后缀来实现。例如:%{NUMBER:num:int},这里将SEMANTIC名称为num的数据从字符串类型转换为整型。目前只支持将数据转换成int或float
例如:按照syntax和semantic的概念,我们可以从这些简单的日志中,拆解出有用的字段。
55.3.244.1 GET /index.html 15824 0.043
与之对应的模式可以设置为:
%{IP:client} %{WORD:method} %{URIPATHPARM:request} %{NUMBET:byte} %{NUMBER:duration}
让我们再看一个更真实的例子:
input{
file{
path=>"/var/log/http.log"
}
filter{
grok{
match=>{"message" => "%{IP:client} %{WORD:,method} %{URIPATHARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
}
}
}
经过上面的grob 过滤器的处理,事件会增加一些额外的字段。
client:55.3.244.1
method:GET
request:/index.html
bytes: 15824
duration: 0.043
Regular Expressions
Grob 是在正则表达式的基础上实现的,因此所有正则表达式的语法在grok中都是有效的。正则表达式的库是Oniguruma,在Oniguruma的站点有你可看到所有正则表达式所支持的语法。
自定义模式
有时候logstash的默认模式中不能满足你的需求,那么你有以下选择: 首先,你可以使用命名的Oniguruma语法获取匹配的文本片,并将它作为一个字段进行保存:
(?<field_name>the pattern here)
例如,日志的后缀中有一个队列id的字段,是一个10位或11位的16进制的值。可以通过如下方法获取这个值:
(?<queue_id>[0-9A-F]{10,11})
或者,你可以创建自定义的模式文件。
创建一个名为patterns的文件夹在其中创建一个名为extra的文件(文件的名字可以命名为其他名字,但建议这个名字对创建者是有意义的)
在那个文件中,写你所需要的模式作为模式名,之后紧跟一个空格,之后是对应该模式的正则表达式。
例如,以前面描述的后缀队列id为例。
# contents of ./patterns/postfix:
POSTFIX_QUEUEID [0-9A-F]]
接下来需要在插件中通过patterns_dir参数设置,告诉Logstash自定义模式文件夹的位置。这里一个完整的例子。
Jan 1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<[email protected]>
filter{
grok{
patterns_dir => ["./patterns"]
match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
}
}
这个过滤器可以把日志拆分成以下字段:
timestamp: Jan 1 06:25:43
logsource: mailserver14
program: postfix/cleanup
pid: 21403
queue_id: BEF25A72965
syslog_message: message-id=<[email protected]>
timestamp, logsource, program, 和 pid 字段的定义来自于SYSLOGBASE 模式,它是在另一个模式中定义的。
概要——Synopsis
这个插件支持下列配置选项:
grok{
}
Setting | Input type | Required | Default value | Detail |
---|---|---|---|---|
add-field | hash | No | {} | |
add_tag | array | No | [] | |
break_on_match | boolean | No | true | |
keep_empty_captures | boolean | No | false | |
match | hash | No | {} | |
named_captures_only | boolean | No | true | |
overwrite | array | No | [] | |
patterns_dir | array | No | [] | |
patterns_files_glob | string | No | false | |
periodic_flush | boolean | No | false | |
remove_field | array | No | [] | |
remove_tag | array | No | [] | |
tag_on_failure | array | No | ["_grokparsefailure"] |