Logstash向Elasticsearch发送日志报错无法索引如何解决
[2021-11-02T11:35:36,774][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_inde ::Event:0xf85da17>], :response=>{"index"=>{"_index"=>"logstash-alias-000015", "_type"=>"_doc", "_id"=>"YNas33wBlcfHwocoMbSU", "status"=>400, "error"=>{"type" ls.Usage.UserUsage] of type [float] in document with id 'YNas33wBlcfHwocoMbSU'. Preview of field's value: 'NaN'","caused_by"=>{"type"=>"illegal_argument_exc ]"}}}}}
问题根因
报错核心为Elasticsearch中ls.Usage.UserUsage字段的映射类型为float,但Logstash推送的该字段值为NaN(非数值),Elasticsearch默认禁止向数值类型字段写入NaN、Infinity这类特殊数值,因此返回400错误拒绝索引,导致日志无法入库。
排查与解决步骤
- 确认异常值来源
在Logstash的filter阶段增加临时控制台输出,排查ls.Usage.UserUsage的NaN值是上游服务原始日志自带,还是Logstash解析、计算过程中生成的异常值。 - Logstash侧修复异常值
在Logstash filter配置中新增该字段的异常处理逻辑,可根据业务场景选择对应方案,参考配置如下:filter { # 匹配UserUsage字段为NaN的日志 if [ls][Usage][UserUsage] == "NaN" { # 方案1:替换为默认值0,适合业务统计允许补0的场景 mutate { convert => { "[ls][Usage][UserUsage]" => "float" } replace => { "[ls][Usage][UserUsage]" => 0 } } # 方案2:删除该字段,适合允许该字段缺省的场景 # mutate { # remove_field => "[ls][Usage][UserUsage]" # } # 方案3:直接丢弃异常日志,适合无效日志不需要入库的场景 # drop {} } } - Elasticsearch侧兼容配置(可选)
若业务确实需要保留NaN这类特殊值,可修改对应索引模板中ls.Usage.UserUsage字段的映射,新增ignore_malformed: true参数,或直接将字段类型改为keyword,修改映射后需重建索引生效。 - 验证修复效果
配置调整完成后重启Logstash,检查Logstash运行日志是否还有400报错,同时确认Elasticsearch对应索引是否有新文档正常写入即可。
内容的提问来源于stack exchange,提问作者saeedhosseini
相关产品推荐
相关产品推荐

