Logstash 6.2持久化队列已满及映射异常相关技术咨询
Logstash持久化队列与常见问题排查
首先还原你遇到的错误日志:
[2018-05-16T00:01:33,334][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"2018.05.15-el-mg_papi-prod", :_type=>"doc", :_routing=>nil}, #<LogStash::Event:0x608d85c1>], :response=>{"index"=>{"_index"=>"2018.05.15-el-mg_papi-prod", "_type"=>"doc", "_id"=>"mHvSZWMB8oeeM9BTo0V2", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse [papi_request_json.query.disableFacets]", "caused_by"=>{"type"=>"i_o_exception", "reason"=>"Current token (VALUE_TRUE) not numeric, can not use numeric value accessors\n at [Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@56b8442f; line: 1, column: 555]}}}}} [2018-05-16T00:01:37,145][INFO ][org.logstash.beats.BeatsHandler] [local: 0:0:0:0:0:0:0:1:5000, remote: 0:0:0:0:0:0:0:1:50222] Handling exception: org.logstash.beats.BeatsParser$InvalidFrameProtocolException: Invalid Frame Type, received: 69 [2018-05-16T00:01:37,147][INFO ][org.logstash.beats.BeatsHandler] [local: 0:0:0:0:0:0:0:1:5000, remote: 0:0:0:0:0:0:0:1:50222] Handling exception: org.logstash.beats.BeatsParser$InvalidFrameProtocolException: Invalid Frame Type, received: 84 ... [2018-05-16T15:28:09,981][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({"type"=>"cluster_block_exception", "reason"=>"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}) [2018-05-16T15:28:09,982][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({"type"=>"cluster_block_exception", "reason"=>"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}) [2018-05-16T15:28:09,982][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({"type"=>"cluster_block_exception", "reason"=>"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"})
接下来逐个解答你的问题:
问题1:如何清空队列?能否直接删除Logstash队列文件夹中的所有文件?
完全可以通过删除队列文件夹文件清空队列,但前提是你能接受丢失这些未处理的日志数据,操作步骤要注意:
- 先停止Logstash服务——如果直接在运行状态下删除文件,可能会导致进程抛出异常或者残留无效数据
- 找到Logstash队列目录(默认是
path.data/queue,具体路径看你logstash.yml里的queue.path配置项),删除目录下的所有文件 - 重新启动Logstash,新的队列会自动创建,之后就可以让Filebeat重新发送数据到正确索引了(记得先修复映射问题,不然新数据还是会触发报错)
问题2:如何准确定位映射问题所在,或是哪台服务器发送了错误类型的数据?
从报错信息看,问题出在*papi_request_json.query.disableFacets*字段——Elasticsearch期望这个字段是数值类型,但收到的是布尔值true。可以通过以下方式定位来源并解决:
- 给Filebeat添加来源标识:在每台服务器的Filebeat配置里,添加自定义字段标记服务器,比如:
这样每条日志都会带上服务器标识,方便后续排查fields: server_id: "web-server-01" - 转存错误事件到本地文件:修改Logstash配置,把映射错误的事件单独输出到文件,方便查看完整内容:
打开output { if "_elasticsearch_status" == "400" { file { path => "/tmp/logstash_failed_events.log" codec => rubydebug } } elasticsearch { # 你的Elasticsearch配置 } }/tmp/logstash_failed_events.log就能看到错误事件的完整信息,包括来源服务器ID - 修复字段类型不匹配:要么修改Elasticsearch索引映射(如果允许的话),要么在Logstash里把字段转成正确类型,比如用
mutate过滤器把布尔值转成1/0:filter { mutate { convert => { "papi_request_json.query.disableFacets" => "integer" } } }
问题3:5000端口的testing-pipeline管道收到的BeatsHandler日志是什么含义?
这些日志是说,Logstash的Beats输入插件(你用5000端口接收Filebeat数据)收到了不符合Beats协议格式的数据包。报错里的69和84是ASCII码,对应字符'E'和'T',大概率是你的Nagios检测用HTTP请求去测5000端口状态,但Beats输入只接受Beats协议的二进制数据,所以触发了这个异常。
解决方案:
- 给Nagios检测换个专门的端口,比如用Logstash的
http输入开一个单独的检测端口 - 或者在Beats输入配置里添加
client_inactivity_timeout参数,自动断开无效连接,避免日志被刷爆
问题4:logstash.outputs.elasticsearch的重试日志理解是否正确?
没错,你的理解完全正确。这些INFO日志就是Logstash在重试之前失败的索引操作——这里的403错误是因为Elasticsearch集群触发了只读保护(一般是磁盘使用率过高导致的),Logstash会按照默认的指数退避策略不断尝试重新发送数据,直到成功或者达到最大重试次数。
你需要先解决Elasticsearch的只读问题:登录ES执行以下命令解除只读限制:
PUT /_all/_settings {"index.blocks.read_only_allow_delete": null}
之后检查磁盘使用率,清理空间或者扩容,不然重试最终还是会失败。
内容的提问来源于stack exchange,提问作者dorinand
相关产品推荐
相关产品推荐

