#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