Дата Logstash не работает с HH: mm:ss.SSS, но работает с HH: mm:ss, SSS

#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}" }
}