Logstash HTTP输出回退:能否基于输出状态码触发其他输出?
如何基于Logstash HTTP输出的状态码触发另一个Elasticsearch输出
当然可以实现这个需求!Logstash的HTTP输出插件支持捕获响应的状态码,结合内置的条件判断逻辑,就能精准地把返回50x状态码的消息转发到另一个Elasticsearch实例中。下面是具体的实现方案:
核心思路
- 开启HTTP输出的响应捕获功能,让Logstash把服务端返回的状态码存储到事件的元数据中;
- 添加一个带有条件判断的Elasticsearch输出,仅当捕获到的状态码属于50x范围时,才将事件发送到目标ES。
配置示例
input { # 这里替换成你的实际输入源,比如Filebeat、日志文件等 beats { port => 5044 } } filter { # 按需添加你的过滤逻辑,比如字段清洗、数据转换等 } output { # 主输出:向自定义服务发送数据 http { url => "http://your-custom-service/api/ingest" method => "post" format => "json" # 关键配置:开启响应捕获,状态码会被存到[@metadata][http][status_code] capture_response => true # 可选:捕获响应体,方便后续排查错误原因 capture_response_body => true } # 条件输出:仅当HTTP返回50x状态码时,转发到备用Elasticsearch if [@metadata][http][status_code] =~ /^5\d{2}$/ { elasticsearch { hosts => ["http://your-fallback-es:9200"] index => "logstash-http-50x-%{+YYYY.MM.dd}" # 按需添加ES认证、超时等配置 # user => "elastic" # password => "your-password" } } }
关键细节说明
capture_response参数:必须设置为true,这是触发后续条件判断的基础。开启后,Logstash会把HTTP响应的状态码、响应体等信息存入事件的[@metadata][http]元数据字段中(元数据不会被输出到最终目的地,仅用于内部逻辑判断)。- 条件判断逻辑:这里用正则
/^5\d{2}$/匹配所有500-599的状态码,你也可以用范围判断替代:if [@metadata][http][status_code] >= 500 and [@metadata][http][status_code] < 600 { # ES输出配置 } - 异常场景补充:如果遇到连接超时、DNS解析失败等无法获取状态码的情况,Logstash会把错误信息存入
[@metadata][http][error]字段。如果需要覆盖这类场景,可以在条件中加入对该字段的判断。
内容的提问来源于stack exchange,提问作者Cavaz
相关产品推荐
相关产品推荐

