Извлеките временную метку из JSON и используйте ее в качестве временной метки события logstash.

Я надеюсь, что кто-нибудь может мне помочь. Ik имеет следующую настройку:

shipper >> redis >> logstash >> elasticsearch

Logstash имеет вход, который извлекает данные журнала из Redis. Следующая строка JSON идет в Redis:

{
  "@fields": {
    "level": "INFO",
    "mdc": {},
    "file": "ContextLoader.java",
    "class": "org.springframework.web.context.ContextLoader",
    "line_number": "273",
    "method": "initWebApplicationContext"
  },
  "@timestamp": "2013-12-18T11::29:29.115+01:00",
  "@message": "Root WebApplicationContext: initialization started",
  "@source_host": "test-host"
}

Конфигурация logstash, которую я использую, проста:

input {
  redis {
    data_type => "list"
    key => "logstash:test:host"
    codec => "json"
  }
}
filter{
  date {
    match => [ "@timestamp", "dd-MMM-YYYY:HH:mm:ssZ", "dd-MMM-YYYY:HH:mm:ss Z", "ISO8601" ]
  }
}
output {
  stdout{
    debug => true
  }
}

Когда я использую приведенную выше конфигурацию, я вижу, что временная метка события logstash используется (2013-12-18T12:53:14.169Z), и я получаю следующую ошибку на своем экране отладки:

Failed parsing date from field {:field=>"@timestamp", :value=>"2013-12-18T12:53:14.177Z", :exception=>#<TypeError: cannot convert instance of class org.jruby.RubyTime to class java.lang.String>, :level=>:warn}

Отсюда я могу сделать следующий вывод:

Когда запись журнала поступает в качестве входных данных, временная метка записи журнала json перезаписывается событием временной метки logstash. Затем, когда фильтр даты пытается проанализировать метку времени, это не удается, потому что нет совпадения.

Я хочу использовать временную метку записи журнала json в качестве временной метки события logstash. Как я могу этого добиться? Я использую logstash версии 1.3.1.


person user3115768    schedule 18.12.2013    source источник


Ответы (1)


Я думаю, вы, возможно, неправильно поняли, как работает фильтр даты (похоже, be docs для 1.3.1) работает, он берет поле и анализирует его по заданному вами шаблону и использует это совпадение для установки значения поля @timestamp (по умолчанию). Поскольку вы берете поле @timestamp, сопоставляете его с шаблоном, а затем пытаетесь установить с ним поле @timestamp, то, что вы делаете, является излишним.

Если у вас есть другое поле метки времени, из которого вы хотите взять дату, я ожидаю, что это, вероятно, сработает, если вы используете правильный шаблон для этого поля.

Я бы также порекомендовал вам обновиться до 1.4.2, так как старая версия, которую вы используете, может содержать ошибки.

person Rumbles    schedule 17.12.2014