【问题标题】:Logstash - parse array of jsons in json eventLogstash - 解析 json 事件中的 json 数组
【发布时间】:2018-09-25 14:45:35
【问题描述】:

我想从 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"

我尝试了json过滤甚至kv,但没有成功。

感谢您的回复。

【问题讨论】:

  • 如果有两个同名的标题会发生什么?
  • 我不确定,这甚至可能发生。
  • 罕见情况。但是可以在 http 中接收具有相同名称的标头。 stackoverflow.com/questions/24502132/….

标签: logstash elastic-stack logstash-configuration


【解决方案1】:

最简单的方法是使用 ruby​​ 代码。像下面的东西。我还没有测试过。但基本上它是从 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)
        "
    }

【讨论】:

  • 感谢您的回复,是的,它可以像这样用 ruby​​ 完成,谢谢。我认为这可以通过一些内置插件来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多