You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:36:04