#logstash
#logstash
Вопрос:
когда я проверяю вывод elasticsearch, он кажется неправильным с отображаемой временной меткой
Для HH: mm:ss.SSS (работает некорректно) -> apache.log
"message" : "[DEBUG] 2020-12-05 12:26:18.254...
"@timestamp" : "2021-01-11T03:31:10.314Z",
Для HH: mm:ss,SSS (работает правильно) -> eai_new.log
"timestamp" : "2020-11-23 06:05:05,297",
"message" : "2020-11-23 06:05:05,297
"@timestamp" : "2020-11-22T22:05:05.297Z"
Кроме того, в чем разница между timestamp и @timestamp?
Ниже приведен мой код входа в систему
filter {
if [name_of_log] in ["apache"] {
grok {
match => { "message" => "[%{LOGLEVEL:level}] %{TIMESTAMP_ISO8601:timestamp} %{GREEDYDATA:msg}" }
}
date {
match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]
}
} else {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:msg}" }
}
date {
match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss,SSS" ]
}
}
}
Ответ №1:
Фильтр даты в logstash имеет целевое поле, в которое помещается значение, которое только что будет проанализировано. Это имя поля по умолчанию — @timestamp .
Таким образом, когда анализ данных в порядке, результат процесса синтаксического анализа сохраняется в поле @timestamp . Здесь у вас есть более подробная информация о фильтре даты logstash.
Если операция синтаксического анализа не работает, @timestamp ставится самим elsaticsearch и значением, соответствующим дате вставки в elasticsearch. Это поведение по умолчанию, если вы не задали конкретную конфигурацию (для сопоставления) в вашем примере elasticsearch.
Поле метки времени устанавливается во время выполнения операции grok. В вашем коде это устанавливает поле метки времени {TIMESTAMP_ISO8601:timestamp} в этой части конфигурации фильтра logstash:
grok {
match => { "message" => "[%{LOGLEVEL:level}] %{TIMESTAMP_ISO8601:timestamp} %{GREEDYDATA:msg}" }
}