如何在Logstash HTTP Filter中以数组形式传递tags字段?
Logstash HTTP Filter传递数组字段的解决方案
你当前的配置中,使用%{tags}进行字段插值时,数组类型的tags会被转换为字符串传输,导致API无法收到原生数组格式。以下是两种可行的解决方法:
方法一:使用JSON格式插值(推荐)
利用Logstash sprintf语法的%{+json:字段名}格式,直接将字段以原生JSON结构插入请求体,保留数组类型。
修改后的HTTP Filter配置:
http { url => "${TAG_GENERATOR_URL}" body => { "previous_tags" => "%{+json:tags}" } verb => POST body_format => "json" ecs_compatibility => "disabled" target_body => tmp add_field => { "tag.version" => "${TAG_LATEST_VERSION}" "new_tags" => "%{[tmp][tags]}" } }
方法二:通过Ruby Filter构造请求体
先使用Ruby Filter创建包含数组字段的请求体哈希,再在HTTP Filter中直接引用该哈希,避免字符串插值带来的类型转换。
步骤1:添加Ruby Filter
ruby { code => ' event.set("[http_request_body][previous_tags]", event.get("tags")) ' }
步骤2:修改HTTP Filter配置
http { url => "${TAG_GENERATOR_URL}" body => "%{[http_request_body]}" verb => POST body_format => "json" ecs_compatibility => "disabled" target_body => tmp add_field => { "tag.version" => "${TAG_LATEST_VERSION}" "new_tags" => "%{[tmp][tags]}" } }
原理说明
常规的%{tags}插值会将数组转换为字符串形式(如"foo,bar"或序列化后的JSON字符串),而%{+json:tags}会直接输出字段的原生JSON表示;通过Ruby Filter构造请求体则是直接将数组字段赋值给哈希,从根源上避免了类型转换问题。
内容的提问来源于stack exchange,提问作者Ehsan Alemzadeh
相关产品推荐
相关产品推荐

