如何用Ruby Filter拼接Hash的所有键并存储为新字段?
搞定Logstash里拼接params哈希键到新字段的需求
你选Ruby代码块来处理这个需求完全没问题,只是之前的代码差了关键一步——把拼接好的结果存到日志事件的新字段里。Logstash的Ruby插件里,操作事件字段得用event.get和event.set方法,我给你调整好代码:
ruby { code => ' # 先取出kv插件解析好的params哈希 params_hash = event.get("params") # 先判断类型,避免空值或非哈希格式导致报错 if params_hash.is_a?(Hash) # 把所有键用逗号拼接,赋值给pattern字段 event.set("pattern", params_hash.keys.join(",")) else # 没有参数或格式异常时,给pattern设空字符串兜底 event.set("pattern", "") end ' }
代码小说明
event.get("params"):从当前日志事件中提取出之前生成的params哈希字段- 加类型判断是为了避免日志无参数、
params为空或格式不对时,代码抛出异常中断处理 params_hash.keys.join(","):提取哈希的所有键,用逗号连接成目标格式的字符串event.set("pattern", ...):把拼接好的字符串正式存入新的pattern字段
如果需要参数键按字母顺序排列,只需要在join前加排序:
event.set("pattern", params_hash.keys.sort.join(","))
完整可用的配置示例
把调整后的Ruby块放到你现有配置里就能直接用:
grok { match => { "request" => [ "url", "%{URIPATH:url_path}%{URIPARAM:url_params}?" ]} } urldecode{ field => "url_path" } mutate { gsub => ["url_params","\?","" ] } kv { field_split => "&" source => "url_params" target => "params" } urldecode{ field => "params" } ruby { code => ' params_hash = event.get("params") event.set("pattern", params_hash.is_a?(Hash) ? params_hash.keys.join(",") : "") ' }
这样处理后,你的pattern字段就会得到param1,param2,param3这类符合预期的结果啦。
内容的提问来源于stack exchange,提问作者thelfter
相关产品推荐
相关产品推荐

