Я настроил 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?
Заранее благодарим за любую помощь или совет, которые вы можете предоставить!
Это не 100% проблема с фильтром, результат - всего лишь симптом. Вот основные части сообщения об ошибке, которые это показывают.
[2017-02-10T15:37:39,361][WARN ][logstash.outputs.elasticsearch]
Это говорит вам о том, что плагин, который не удался, был результатом elasticsearch.
Failed action. {:status=>400, :action=>["index",
(Обрезано для ясности) Это попытка index
действие на 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
поле. Это признак того, что timestamp
поле фактически не проходило через date {}
фильтр. Это говорит о том, что if [type] == "httpd_access_log" {
не улавливает все возможные экземпляры timestamp
, или шаблон для вашего фильтра даты не улавливает этого. Строка ошибки была очищена, но я не уверен, действительно ли ваш источник выдает отметку времени, например:
10/Feb/2017:15:37:30 -0800
Если он действительно так поступает в конвейер, выясните, почему.