Logstash - разобрать массив jsons в событии json - PullRequest
0 голосов
/ 25 сентября 2018

Я хотел бы проанализировать некоторые поля из журналов json из AWS WAF.При вводе 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, но не могу это сделать.

Вывод в кибане должен выглядеть следующим образом:

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

Я пробовал json filter даже kv, но безуспешно.

Спасибо за любой ответ.

1 Ответ

0 голосов
/ 26 сентября 2018

Самый простой способ - использовать код ruby.Что-то вроде ниже.Я не проверял это.Но в основном это создание новых событий из массива заголовков.Может возникнуть проблема, если существует более одного события с одинаковым именем.Это могло бы переписать с последним.

 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)
        "
    }
...