Logstash Filter:如何用字段值作为解析JSON后新字段的名称?
Logstash动态生成嵌套字段结构解决方案
问题场景
输入Logstash的JSON事件结构如下(字段值动态变化):
{ "metadata":{ "app_type":"Foo", "app_namespace":"System.Bar", "json_string":"{\"test\":true}" } }
需要输出到Elasticsearch的目标结构(保留原始字段):
{ "metadata":{ "app_type":"Foo", "app_namespace":"System.Bar", "json_string":"{\"test\":true}" }, "app_event":{ "foo":{ "system_bar":{ "test":true } } } }
正确过滤器配置
使用json过滤器解析JSON字符串,再通过ruby过滤器实现动态字段路径的创建:
filter { # 先将json_string解析到临时字段,避免直接操作复杂路径 json { source => "[metadata][json_string]" target => "[temp_parsed]" } # 用ruby过滤器处理动态字段逻辑 ruby { code => ' # 提取并处理app_type:转小写 app_type = event.get("[metadata][app_type]").downcase # 提取并处理app_namespace:转小写+替换点号为下划线 app_namespace = event.get("[metadata][app_namespace]").downcase.gsub(".", "_") # 构建目标字段路径数组 target_path = ["app_event", app_type, app_namespace] # 将解析后的内容写入目标路径 event.set(target_path, event.get("[temp_parsed]")) # 可选:删除临时字段,减少冗余 event.remove("[temp_parsed]") ' } }
之前配置的问题分析
第一种配置的问题:
json过滤器的target参数不支持直接使用%{}插值语法生成动态字段路径,且未处理大小写转换和点号替换的需求。第二种配置的问题:
Logstash的filter块无法直接使用普通Ruby变量赋值语法,所有字段处理逻辑必须放在ruby过滤器的code代码块内执行,否则会触发配置语法错误。
内容的提问来源于stack exchange,提问作者str8killinit
相关产品推荐
相关产品推荐

