logstash : создать отпечаток пальца из части метки времени

У меня проблема с созданием отпечатка пальца на основе IP-адреса клиента и метки времени, содержащей дату + час. Я использую logstash 7.3.1. Вот соответствующая часть моего файла конфигурации

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date{ 
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
  ...
  ruby{
    code => "
      keydate = Date.parse(event.get('timestamp'))
      event.set('keydate', keydate.strftime('%Y%m%d-%H'))
    "
  }
  fingerprint {
    key => "my_custom_secret"
    method => "SHA256"
    concatenate_sources => "true"
    source => [
      "clientip",
      "keydate"
    ]
  }
}

Проблема в блоке «рубин». Я пробовал несколько методов для вычисления ключевой даты, но ни один из них не работает без ошибок. Последний (с использованием этого файла конфигурации)

[ERROR][logstash.filters.ruby    ] Ruby exception occurred: Missing Converter handling for full class name=org.jruby.ext.date.RubyDateTime, simple name=RubyDateTime

входной документ

{
      "timestamp" => "19/Sep/2019:00:07:56 +0200",
       "referrer" => "-",
       "@version" => "1",
     "@timestamp" => 2019-09-18T22:07:56.000Z,
             ...
        "request" => "index.php",
           "type" => "apache_access",
       "clientip" => "54.157.XXX.XXX",
           "verb" => "GET",
             ...
           "tags" => [
              [0] "_rubyexception"  # generated by the ruby exception above
           ],
       "response" => "200"
}

ожидаемый результат

{
      "timestamp" => "19/Sep/2019:00:07:56 +0200",
       "referrer" => "-",
       "@version" => "1",
     "@timestamp" => 2019-09-18T22:07:56.000Z,
             ...
        "request" => "index.php",
           "type" => "apache_access",
       "clientip" => "54.157.XXX.XXX",
           "verb" => "GET",
             ...
        "keydate" => "20190919-00", #format : YYYYMMDD-HH
    "fingerprint" => "ab347766ef....1190af",
       "response" => "200"
}

Как всегда, большое спасибо за вашу помощь!


person Renaud Michotte    schedule 19.09.2019    source источник
comment
Можете ли вы изменить эту строку keydate = Date.parse(event.get('timestamp')) на эту: keydate = Date.parse(event.get('timestamp').to_s). Или вы можете попробовать установить событие без использования функции Date.parse следующим образом: event.set('keydate', Date.strptime('timestamp', '%Y%m%d-%H')).   -  person diabolique    schedule 20.09.2019


Ответы (1)


Я советую удалить рубиновый фрагмент и использовать встроенный фильтр даты: https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html

То, что вы делаете в ruby-фрагменте, — это именно то, что делает фильтр даты — извлекает метку времени из поля и реконструирует ее в желаемый формат.

другой вариант (немного менее рекомендуемый, но также сработает) — использовать grok для извлечения соответствующих частей метки времени и объединения их другим способом.

person Opster Elasticsearch Expert    schedule 25.09.2019