You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:42:38