Logstash无法处理NaN值:如何启用ALLOW_NON_NUMERIC_NUMBERS?
Logstash处理JSON中NaN值的配置方案
要解决Logstash无法解析含NaN值JSON的问题,核心是在JSON编解码器中启用ALLOW_NON_NUMERIC_NUMBERS特性,具体配置修改如下:
1. 修改Kafka输入的JSON编解码器配置
将原配置中简单的codec => json替换为带参数的编解码器块,显式开启非标准数值支持:
input { kafka { bootstrap_servers => "MY_SERVER" topics => [ MY_SOURCE_1, MY_SOURCE_2 ] codec => json { allow_non_numeric_numbers => true } decorate_events=> true } }
2. 补充Elasticsearch写入兼容处理
注意:Elasticsearch默认不支持将NaN作为字段值存储,即使Logstash解析成功,写入ES时仍可能报错。建议在filter阶段将NaN替换为null或业务允许的默认值,示例如下:
方法一:使用mutate+gsub(针对字符串形式的NaN)
如果解析后NaN以字符串形式存在:
filter { mutate { gsub => [ "field_with_nan", "NaN", "null" ] } mutate { convert => { "field_with_nan" => "float" } } }
方法二:使用Ruby filter(针对数值类型的NaN)
如果解析后NaN是数值类型:
filter { ruby { code => " event.to_hash.each do |k, v| if v.is_a?(Float) && (v.nan? || v.infinite?) event.set(k, nil) end end " } }
原配置其他部分保持不变
filter和output模块可保留原有配置,无需额外修改。
内容的提问来源于stack exchange,提问作者Bleach
相关产品推荐
相关产品推荐

