【问题标题】:grab only part of a grok match in logstash在 logstash 中仅获取 grok 比赛的一部分
【发布时间】:2016-06-02 22:01:31
【问题描述】:

我想必须有一种方法可以做到这一点,但我无法从我能找到的文档中找出方法

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

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”,而不是我得到整个请求。我不知道如何才能得到我需要的部分

非常感谢您的帮助

【问题讨论】:

    标签: logstash grok


    【解决方案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 删除您不需要的任何内容。

    【讨论】:

    • 感谢您的回答,这并不能解决我正在处理的问题,因为 req_type 将是 url 的不同部分,有时是部分的组合,例如 URIPATH[1] 有时和 URIPATH[3] 有时有时是两个 URIPATH[1] + URIPATH[2] 的组合
    • 您能否提供更多您需要了解的 URL 示例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多