网上关于Logstash的介绍性文章还不少,写的不错的几篇如:《Logstash介绍》、《一文快速上手Logstash》,当然还有系统性的介绍的Gitbook如【Logstash 最佳实践】,而整个Logstash中最难的部分在于grok表达式的编写,尤其很多个性化的复杂日志都需要自定义的表达式来进行正则,这些在上述博客中都甚少涉及,于是自己摸索出来一些实践经验,这篇文章总结了自己如何进行grok表达式的调试和编写自定义Logstash并运行。
二、Grok自定义正则的编写
1、编写ruby正则表达式
grok表达式的语法来源于Ruby正则,因此编写Grok正则只需要查阅ruby的正则语法,比较好的工具网站就是:【Ruby 正则表达式】,大家可以在这里进行语法查询,比如常用的一些语法如下:
模式 | 描述 |
---|---|
[...] | 匹配在方括号中的任意单字符。 |
[^...] | 匹配不在方括号中的任意单字符。 |
re* | 匹配前面的子表达式零次或多次。 |
re+ | 匹配前面的子表达式一次或多次。 |
re{ n, m} | 匹配前面的子表达式至少 n 次至多 m 次。 |
\w | 匹配单词字符。 |
\s | 匹配空白字符。等价于 [\t\n\r\f]。 |
比如我的日志都是以[]
来进行内容匹配,我的正则需求就是中括号作为分隔符,而中括号中的内容就是我要正则过滤的内容,我们可以这样写:
模式 | 描述 |
---|---|
\[\] |
匹配中括号[] |
[^\[\]]+)\] |
匹配中括号[]且中括号内可包含任意字符(非'['、']') |
以上就是一个中括号匹配的情况,如果有多个的话还是以此类推,但是最后一个的括号结束的时候可以约定一个特殊的表达,这样不会匹配到错误的内容上去。
2.ruby正则的调试
ruby正则表达式和别的语言的正则有略微差别,所以不能简单的用网上的其余语言的测试工具来调试,在这里我提供一个较为不错的ruby正则调试网站: Rubular:a Ruby regular expression editor。
大家可以把待测字符串和自己的正则表达式填入对应的位置,点击make按钮就能方便的调试,及时调试和反馈爽的不要不要的。
一、Grok自定义调试
网上很多文章都推荐使用 Grok Debugger 来调试自己的 grok 表达式,但是大家有没有打开这个龟速一般的网站体验到一丝凉凉的感觉,的确整个页面的调试没有任何说明和demo,即便输入了几个表达式进行调试的时候也会在处于不停转圈的状态,不管是有没有墙这样的体验的确糟糕,如果第一步“Grok自定义正则的编写”已经调试差不多的情况下,那么剩下的工作就是把整个逻辑进行一遍集成测试而已。
1.编写调试配置文件
Logstash有一个生成测试数据(Generator)的插件,实际运行的时候这个插件是派不上用途的,但是作为调试却非常OK!假设在上面一步中我们已经能够调通了表达式,那么接下来要做的就是把正则表达式嵌入到grok中去,有些建议放到partern文件中去,如果表达式不是很复杂的话,建议直接按照(?<name>pattern)
的写法就OK了。
给一个input插件的配置实例如下:
input {
generator {
count => 10
message => '[2019-05-18 00:00:18.990][INFO ][][20883-thread-67]
[c.p.d.s.impl.user.UserSettingService]:get language userSetting=null'
codec => json
}
}
参数说明:
- generator 定义输入为测试数据生成器
- count 生成次数,即重复生成多少次
- message 就是我要测试的内容信息
- codec 指定生成的编码格式为json
定义Filter和Output配置,此处我的grok则是按照【时间】【级别】【全局Traceid】【线程号】【方法名】【日志信息】排序中括号来进行正则的,依次要把timestamp、level、traceId、thread还有method从每个中括号中提取出来:
filter {
grok {
match => [
"message", "message","\[(?<timestamp>[^\[\]]+)\]\[(?<level>[^\[\]]+)\]
\[(?<traceid>[^\[\]]*)\]\[(?<thread>[^\[\]]+)\]\[(?<method>[^\[\]]+)\]"
]
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
output {
stdout {
codec => rubydebug
}
}
2.调试与运行
将上述配置命名一个配置文件,放到logstash的config目录下,可以命名为logstash-test.conf文件,然后进入到/bin目录下执行logstash命令:
./logstash -f /usr/logstash/config/logstash-test.conf
执行过程中,因为启动logstash会有些耗时,需要等到几秒钟,马上就可以再控制台的输出日志中看到过滤之后的信息,如果能看到:
{
"message" => "[2019-05-18 00:00:18.990][INFO ][][20883-thread-67]
[c.p.d.s.impl.user.UserSettingService]:get language userSetting=null",
"tags" => [
[0] "_dateparsefailure"
],
"host" => "localhost",
"timestamp" => "2019-05-18 00:00:18.990",
"level" => "INFO ",
"thread" => "20883-thread-67",
"@version" => "1",
"method" => "c.p.d.s.impl.user.UserSettingService ",
"@timestamp" => 2019-05-11T07:55:02.127Z,
"sequence" => 0
}
结果信息中的属性timestamp、level、traceId、thread分别已经获取到了【时间】【级别】【全局Traceid】【线程号】【方法名】,证明测试OK通过,接下来只需把filter部分的grok表达式挪到线上环境的配置中就大功告成了!
网友评论