Logstash-解析json事件中的json数组

时间:2018-09-25 14:45:36

标签: logstash elastic-stack logstash-configuration

我想从AWS WAF的json日志中解析一些字段。在输入logstash上使用:

s3 {
    bucket => "XXXX"
    access_key_id     => "XXXX"
    secret_access_key => "XXXX"
    prefix            => "waf/"
    region       => "XXX"
    sincedb_path => "/tmp/s3.sincedb"
    add_field    => [ "lso_name", "NULL", "lsi_type", "s3", "lsi_name", "waf" ]
    codec        => "json"
}

我收到如下消息:

{
    "httpSourceName"=>"CF",
    "httpRequest"=> {
        "clientIp"=>"XX.XX.XX.XX",
        "httpMethod"=>"GET",
        "requestId"=>"XXXX",
        "uri"=>"XXX", 
        "headers"=>
            [
                {"name"=>"Host", "value"=>"test.exmaple.com"},
                {"name"=>"user-agent", "value"=>"Mozilla/5.0"},
                {"name"=>"accept", "value"=>"*/*"}
            ]
    }
}

我正在尝试在logstash过滤器中解析该标头,但无法做到。

在kibana中的输出应类似于:

"httpRequest.headers.Host" => "test.example.com"
"httpRequest.headers.user-agent" => "Mozilla/5.0"

我尝试了kv的json过滤器,但没有成功。

感谢您的回复。

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用红宝石代码。像下面这样。我还没有测试。但基本上,它是从headers数组创建新事件。如果有多个同名事件,则可能会出现问题。它可能会被最后一个覆盖。

 ruby {
      init => "
        def process_headers obj, event
          if obj.is_a? Array
            obj.each {|a|
              event.set("[httpRequest][headers]["+a['name']+"]")=a['value']
            }
          end
        end
      "
      code => "
        process_headers(event.get["httpRequest][headers]",event)
        "
    }