在logstash中只抓取一部分grok匹配

时间:2016-06-02 22:01:32

标签: logstash grok

我想有必要有办法做到这一点,但我无法从我能找到的文档中找出方法来做到这一点

我有一个模式文件来识别请求的类型:

FOO .*foo.* #request type foo 
BAR .*bar.* #request type bar

我想从看起来像的东西中获取请求的类型 http://something.com/foo/aaa

我的logstash过滤器包含以下内容:

match => { "request" => [ "%{FOO:req_type}", "%{BAR:req_type}" ] }

我想要" foo"被分配到" req_type"相反,我得到了整个请求。我不确定如何获得我需要的部分

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您不需要为此定义自定义grok模式,但您可以利用现有的URI模式,然后在URIPATH上拆分提取的/并分配第一个路径组件到req_type。它是这样的:

filter {
  grok {
    match => { "message" => "%{URI}" } 
    named_captures_only => false
  }
  mutate {
     split => { "URIPATH" => "/" }
     add_field => {"req_type" => "%{URIPATH[1]}" }
  }
}

您的活动将与此类似(请注意底部的req_type字段):

{
         "message" => "http://something.com/foo/aaa",
        "@version" => "1",
      "@timestamp" => "2016-06-03T04:45:25.731Z",
            "host" => "iMac.local",
             "URI" => "http://something.com/foo/aaa",
        "URIPROTO" => "http",
         "URIHOST" => "something.com",
        "IPORHOST" => "something.com",
        "HOSTNAME" => "something.com",
    "URIPATHPARAM" => "/foo/aaa",
         "URIPATH" => [
        [0] "",
        [1] "foo",
        [2] "aaa"
    ],
        "req_type" => "foo"
}

请注意,您可以使用remove_field删除任何不必要的内容。