Logstash的过滤器

发表时间:2017-09-25 15:22:46 浏览量( 32 ) 留言数( 0 )

学习目标:

1、了解Logstash的过滤器的使用


学习过程:

  丰富的过滤器插件的存在是 logstash 威力如此强大的重要因素。名为过滤器,其实提供的不单单是过滤的功能。它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的 logstash 事件到后续的流程中去!

写一个新的配置文件,内容如下:

input {

   stdin { }

}

filter {

    grok {

        match => {

            "message" => "\s+(?<request_time>\d+(?:\.\d+)?)\s+"

        }

    }

}

output

{

   stdout {

         codec=>rubydebug

   }

}

启动

[root@newrun1 logstash]# ./bin/logstash -f etc/testfilter.conf 

看一下,我们先输入hello world并没有request_time解析出来。而输入符合正则表达式的就可以是可以解析出来了:

attcontent/9db10759-580d-49b9-86a9-8f94897f70f6.png


二、Grok 表达式语法

Grok 支持把预定义的 grok 表达式 写入到文件中,


使用grok filter需要在logstash的配置文件中加上这样的内容:


filter {

    grok {

        match => { "message" => "grok_pattern" }

    }

}


这段代码中除了grok_pattern以外都是logstash的关键字。grok_pattern部分需要使用者填充自己的解析方式。

grok_pattern由零个或多个%{SYNTAX:SEMANTIC}组成,其中SYNTAX是表达式的名字,是由grok提供的,例如数字表达式的名字是NUMBER,IP地址表达式的名字是IP。SEMANTIC表示解析出来的这个字符的名字,由自己定义,例如IP字段的名字可以是client。


对于下面这条日志:


55.3.244.1 GET /index.html 15824 0.043

可以这样解析:


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提供了哪些SYNTAX?可以查看文件grok-patterns,它默认放在路径,如果你要自定义也可以进入自己定义一些的

logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.2/patterns



写一个新的配置文件,内容如下:

input {

   stdin { }

}

filter {

    grok {

        match => {

            "message" => "%{WORD} %{NUMBER:request_time:float} %{WORD}"

        }

    }

}

output

{

   stdout {

         codec=>rubydebug

   }

}

启动

[root@newrun1 logstash]# ./bin/logstash -f etc/testfilter2.conf 

我们输入的效果和上面的例子一样

attcontent/51e98dca-fd95-419f-88be-6f04d22b27a3.png

grok是目前logstash里最好的一种解析各种非结构化的日志数据的工具 官方patterns地址:

 https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

例子

Nginx 日志:

    55.3.244.1 GET /index.html 15824 0.043

匹配

    pattern: %{IP:ip}%{WORD:method}%{URIPATHPARAM:request}%{NUMBER:bytes}%{NUMBER:duration}

完整实例:

input {

    file {

        path => "/var/log/nginx_access.log"

        type => "nginx"

        start_position => "beginning"

    }

}

filter {

    grok {

        match => ["message", "%{IP:ip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"]

  }

}

output {

    stdout{codec=>rubydebug}

}