Проблема с анализом даты в ELK Logstash с пользовательским форматом временных меток Java для журналов

#logging #timestamp #date-format #elastic-stack

#протоколирование #временная метка #формат даты #эластичный стек

Вопрос:

Ниже приведены примеры журналов, полученных из приложения Java

 2019-04-11 9:08:22:562 Log 1 
2019-04-11 9:08:22:660 Log 2 
2019-04-11 9:08:43:79 Log 3 
2019-04-11 9:08:43:156 Log 4 
 

Из приведенных выше журналов я сталкиваюсь с проблемой Log 3 , когда значение миллисекунд составляет всего 79, но после анализа в Logstash значение устанавливается как 790 мс (анализ Logstash верен, но значение журнала Java неверно). На самом деле значение должно быть 2019-04-11 9:08:43:079 в журнале для правильного анализа.

Фильтр Logstash выглядит следующим образом:

 date {
    match => [ "log_time", "yyyy-MM-dd HH:mm:ss:SSS", "ISO8601" ]
    target => "log_time"
    timezone => "CET"
}
 

Копнув глубже, я обнаружил, что проблема связана с протоколированием Java с этим форматом времени, она будет решена, если формат yyyy-MM-dd HH:mm:ss.SSS . Но приложение для ведения журнала использует формат yyyy-MM-dd HH:mm:ss:SSS , который вызывает эту проблему (обратите внимание на разницу в формате :SSS и .SSS ).

Я не могу изменить систему ведения журнала Java, так есть ли какой-либо обходной путь с фильтром Logstash для устранения этой проблемы.

Ответ №1:

Я решил ее, вставив префикс 0 в миллисекунды, имеющие только 2 цифры, используя следующий gsub:

 mutate { gsub => [ "log_time", "^([0-9-]  [0-9] :[0-9]{2}:[0-9]{2}:)([0-9])$", "1002",
"log_time", "^([0-9-]  [0-9] :[0-9]{2}:[0-9]{2}:)([0-9]{2})$", "102" ] }
 

Получил помощь от elastic discussing group