美文网首页ElasticSearch专栏
LogStash如何编写自定义grok正则式

LogStash如何编写自定义grok正则式

作者: 千淘萬漉 | 来源:发表于2019-05-20 21:37 被阅读0次

    网上关于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表达式挪到线上环境的配置中就大功告成了!

    相关文章

      网友评论

        本文标题:LogStash如何编写自定义grok正则式

        本文链接:https://www.haomeiwen.com/subject/tmjhzqtx.html