Logstash解析JSON时remoteReferenceId字段取值异常求助
问题原因
- JSON解析配置错误:你设置的
jsonfilter指定source => "messages",但实际输入的是包含messages数组的完整JSON对象,应该先解析整个输入内容,而非直接解析messages字段。这导致Logstash事件的顶层不存在remoteReferenceId字段,所以mutate里的占位符%{[remoteReferenceId]}找不到对应值,只能原样输出。 - 未处理数组拆分:
messages是数组结构,remoteReferenceId只存在于数组的每个元素中。你没有将数组拆分为单独的事件,直接在顶层引用不存在的字段,自然无法获取到真实值。
修正后的Logstash配置
input { file { mode => "read" path => "/path-to-data/*.json" file_completed_action => "delete" start_position => "beginning" sincedb_path => "/dev/null" type => "json" codec => multiline { pattern => "remoteReferenceId" negate => true what => previous auto_flush_interval => 1 multiline_tag => "" } } } filter{ # 解析整个输入的JSON内容,生成顶层的messages数组和timestamp字段 json{ source => "message" } # 将messages数组拆分为单独事件,每个数组元素对应一条事件 split { field => "messages" } # 拆分后每个事件的messages是单个对象,可直接引用其中的remoteReferenceId mutate { add_field => { "remoteReferenceId" => "%{[messages][remoteReferenceId]}" } # 可选:不需要保留原始messages字段时可删除 # remove_field => ["messages"] } } output { elasticsearch{ hosts => ["http://localhost:9200/"] index => "index_messages" } stdout { codec => rubydebug } }
关键说明
- 用
json{ source => "message" }解析完整输入,让Logstash识别到顶层的messages数组和timestamp字段。 splitfilter把数组拆成独立事件,每个事件对应一条消息数据。- 拆分后每个事件的
messages是单个对象,通过%{[messages][remoteReferenceId]}就能正确提取到目标值。
内容的提问来源于stack exchange,提问作者andrew0007
相关产品推荐
相关产品推荐

