Ошибка «mapper_parsing_exception» из-за того, что Elasticsearch не смог проанализировать [временную метку] из% {COMBINEDAPACHELOG}

Я настроил Logstash для фильтрации сообщений httpd_access_log и проверки поля, связанные с COMBINEDAPACHELOG . Однако я получаю следующие ошибки:

[2017-02-10T15:37:39,361][WARN ][logstash.outputs.elasticsearch] Failed action. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"filebeats", :_type=>"logs", :_routing=>nil}, 2017-02-10T23:37:34.187Z perf-wuivcx02.hq.mycompany.com cdn.mycompany.com 192.168.222.60 - - [10/Feb/2017:15:37:30 -0800] "GET /client/asd-client-main.js HTTP/1.1" 200 221430 "http://perf.companysite.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"], :response=>{"index"=>{"_index"=>"filebeats", "_type"=>"logs", "_id"=>"AVoqY6qkpAiTDgWeyMHJ", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse [timestamp]", "caused_by"=>{"type"=>"number_format_exception", "reason"=>"For input string: \"10/Feb/2017:15:37:30 -0800\""}}}}}

Вот моя конфигурация фильтра Logstash:

filter {
  if [type] == "json" {
    json {
      source => "message"
    }
  }
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
  if [type] == "httpd_access_log" {
    grok {
      match => { "message" => "%{URIHOST} %{COMBINEDAPACHELOG}" }
    }
    date {
      match => [ "timestamp", "MMM dd yyyy HH:mm:ss", "MMM  d yyyy HH:mm:ss", "ISO8601" ]
    }
  }
}

Функция date отлично работает для обработки сообщений типа syslog , но не работает для сообщений httpd_access_log . Кто-нибудь знает, почему из-за временных меток строки из файлов httpd_access_log не индексируются в Elasticsearch?

Заранее благодарим за любую помощь или совет, которые вы можете предоставить!

0
задан 11 February 2017 в 02:07
1 ответ

Это не стопроцентная проблема с фильтром, вывод - всего лишь симптом. Вот ключевые части сообщения об ошибке, которое показывает вам это.

[2017-02-10T15:37:39,361][WARN ][logstash.outputs.elasticsearch]

Это говорит вам, что плагин, который не удался, был результатом elasticsearch.

Failed action. {:status=>400, :action=>["index",

(вырезано для ясности) Это попытка выполнить действие index on ElasticSearch.

"error"=>
  {"type"=>"mapper_parsing_exception",
   "reason"=>"failed to parse [timestamp]",
   "caused_by"=>
     {"type"=>"number_format_exception",
      "reason"=>"For input string: \"10/Feb/2017:15:37:30 -0800\""}
     }
   }

Здесь происходит то, что поле timestamp в индексе не принимает строку, которую вы пытаетесь вставить в него. Тот факт, что он говорит number_format_exception , говорит о том, что ElasticSearch ожидает в качестве входных данных не строку.

Logstash пытается записать строку в поле timestamp . Это признак того, что поле отметка времени на самом деле не прошло через фильтр дата {} . Это говорит о том, что if [type] == "httpd_access_log" { не улавливает все возможные экземпляры отметки времени , или шаблон для вашего фильтра даты не улавливает это. Строка с ошибкой была удалена, но я не уверен, действительно ли ваш источник выдает отметку времени, например:

10/Feb/2017:15:37:30 -0800

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

0
ответ дан 24 November 2019 в 04:59

Теги

Похожие вопросы