如何使用Logstash HTTP Filter插件发送完整事件至外部服务?
当然可以!你完全能够把整个Logstash事件发送给你的enrichment服务,而不是仅传递单个字段。这里有两种可靠的实现方式,帮你搞定这个需求:
方法1:使用Ruby过滤器序列化整个事件
这种方法最通用,不管你用什么输入codec都能生效。我们先通过Ruby过滤器把整个事件转换成标准JSON字符串,再将这个字符串作为HTTP请求体发送:
filter { if [A] { # 把整个事件序列化为JSON字符串,存入full_event字段 ruby { code => "event.set('full_event', event.to_json)" } http { url => "http://localhost/dosomething" verb => "POST" # 使用刚才生成的full_event字段作为请求体 body => "%{full_event}" # 因为body已经是JSON格式的字符串,所以设置body_format为raw body_format => "raw" # 指定返回结果存入enrichment字段 target_body => "[enrichment]" # 设置请求头,告诉服务端我们发送的是JSON格式数据 headers => { "Content-Type" => "application/json" } } } }
这里的event.to_json会把Logstash事件里的所有字段(包括嵌套字段)完整转成JSON字符串,确保服务端能拿到整个事件的全部信息。
方法2:直接使用%{@json}(如果已启用)
如果你的Logstash输入配置中使用了json codec,并且保留了@json字段(默认会被自动移除,需要手动配置保留),那可以直接引用这个字段来发送整个事件:
首先要确保输入codec保留@json字段:
input { # 示例:以file输入为例,配置json codec并保留@json file { path => "/path/to/your/logs.json" codec => json { remove_field => [] # 不要移除@json字段 } } }
然后在HTTP Filter里直接使用:
filter { if [A] { http { url => "http://localhost/dosomething" verb => "POST" body => "%{@json}" body_format => "raw" target_body => "[enrichment]" headers => { "Content-Type" => "application/json" } } } }
小提示
- 优先推荐方法1,因为它不依赖输入codec的配置,适用性更广;
- 记得设置
Content-Type请求头,否则服务端可能无法正确解析JSON数据; - 如果你的enrichment服务对请求体大小有限制,要注意事件的大小是否符合要求。
内容的提问来源于stack exchange,提问作者Jethro
相关产品推荐
相关产品推荐

