如何在Logstash管道中用Ruby过滤器获取动态字段数据?
Logstash处理动态字段名的正确配置方案
原配置的核心问题是Ruby过滤器的代码块中错误使用了Logstash的字段插值语法(%{}),这个语法仅在Logstash的配置参数(如mutate的add_field)中生效,无法在Ruby代码里直接解析。
方案一:直接使用原指定字段(推荐)
不需要额外通过mutate复制字段,直接从your_data_is_in获取动态字段名:
filter { ruby { tag_on_exception => '_my_exception' code => ' # 获取动态字段的名称 dynamic_field_name = event.get("your_data_is_in") # 校验字段是否存在,避免异常 if dynamic_field_name && event.include?(dynamic_field_name) # 根据动态字段名提取目标数据 event.set("the_data_i_need", event.get(dynamic_field_name)) else # 动态字段不存在时打标签,方便后续排查 event.tag("_dynamic_field_not_found") end ' } }
方案二:保留mutate字段复制的版本
如果需要保留dynamic_fieldname这个中间字段,修正Ruby代码的字段获取逻辑即可:
filter{ mutate { add_field => { "dynamic_fieldname" => "%{your_data_is_in}" } } ruby { tag_on_exception => '_my_exception' code => ' # 先获取中间字段存储的动态字段名 target_field = event.get("dynamic_fieldname") if target_field && event.include?(target_field) event.set("the_data_i_need", event.get(target_field)) else event.tag("_dynamic_field_not_found") end ' } }
关键注意点
- Ruby代码块中必须通过
event.get("字段名")获取字段值,不能使用%{字段名}的插值语法。 - 添加
event.include?(字段名)的判断可以避免因动态字段不存在导致的异常,同时通过tag标记异常场景便于排查。
内容的提问来源于stack exchange,提问作者gl4ssiest
相关产品推荐
相关产品推荐

