我正在使用logstash 6.2.4以及以下yml设置 -

pipeline.batch.size: 600
pipeline.workers: 1
dead_letter_queue.enable: true

用于运行logstash应用程序的conf文件是 -

input {
    file {
        path => "/home/administrator/Downloads/postgresql.log.2018-10-17-06"
        start_position => "beginning"
        }
}
filter {
  grok {
        match => { "message" => "%{DATESTAMP:timestamp} %{TZ}:%{IP:uip}\(%{NUMBER:num}\):%{WORD:dbuser}%{GREEDYDATA:msg}"}
}
        }
output {
   stdout { codec => rubydebug }
   elasticsearch {
   id => 'es-1'
   hosts => ["localhost:9200"]
   timeout => 60
   index => "dlq"
   version => "%{[@metadata][version]}"
   version_type => "external_gte"
 }
}

输入是一个普通的日志文件,使用grok过滤器格式化 . 这里的版本始终是字符串而不是整数,因此elasticsearch会抛出错误400 Bad Request .

在这个错误代码上 - logstash应该重试有限次数,然后应该将此请求有效负载推送到dead_letter_queue文件(根据文档 - https://www.elastic.co/guide/en/logstash/current/dead-letter-queues.html),但它会陷入无限循环中并与之相关 -

[2018-10-23T12:11:42,475] [错误] [logstash.outputs.elasticsearch]遇到可重试的错误 . 将以指数退避重试{:code => 400,:url =>“localhost:9200 / _bulk”}

以下是data / dead_letter_queue / main目录的内容 -

1.log(包含单个值“1”)

如果缺少导致这种情况的任何配置,请提供帮助 .