ELK 8.10.2-1环境下Logstash按Kong响应状态码加标签失败求助
解决Logstash根据Kong日志HTTP状态码添加标签失效的问题
你的标签未生效的核心原因是字段类型不匹配,Kong日志里的response.status默认是数字类型(比如401),但你的配置里用了字符串"401"做匹配,导致条件判断不成立。以下是修正方案和验证步骤:
一、修正Logstash配置
修改filter中的条件判断,将字符串匹配改为数字匹配,同时推荐使用嵌套字段写法[response][status](比[response.status]更稳妥):
input { udp { port => 9000 } } filter { json { source => "message" add_tag => ["kong"] # 可选:解析完成后移除原始message字段以减少冗余 # remove_field => ["message"] } # 匹配数字类型的401状态码 if [response][status] == 401 { mutate { add_tag => [ "http_error_401" ] } } } output { elasticsearch { hosts => ["https://xx.xx.xx.xx:9200" , "https://xx.xx.xx.xx:9200" , "https://xx.xx.xx.xx:9200"] user => "elastic_user" password => "${elastic_password}" ssl => true ssl_certificate_verification => false cacert => "/etc/logstash/http_ca.crt" ilm_rollover_alias => "kong" ilm_pattern => "{now/d}-000001" ilm_policy => "kong-index-policy-example" } if "http_error_401" in [tags] { email { to => "elk-user@mail.example.com" from => "elk-user@mail.example.com" subject => "API-Error at %{@timestamp}" # 修正换行符转义问题,用\n\n代替\\n\\ body => "Tags: %{tags}\n\nContent:\n%{message}" via => "smtp" address => "mail.example.com" port => 25 } } # 可选:临时添加控制台输出,用于验证字段结构和标签 # stdout { codec => rubydebug } }
二、验证步骤
确认字段结构与类型
临时添加stdout { codec => rubydebug }输出到控制台,运行Logstash后查看日志中的response字段:- 如果输出是
"response" => { "status" => 401 },说明是数字类型,用== 401匹配; - 如果是
"response" => { "status" => "401" },才用== "401"匹配。
- 如果输出是
检查JSON解析是否成功
查看tags中是否存在_jsonparsefailure标签,如果有,说明原始日志不是标准JSON格式,需要先确保日志能被正确解析,否则response.status字段不会生成。
三、扩展优化
- 可以批量处理多种状态码,比如同时匹配4xx、5xx错误:
if [response][status] >= 400 and [response][status] < 600 { mutate { add_tag => [ "http_error_%{[response][status]}" ] } } - 邮件输出可以添加更多上下文信息,比如请求路径、客户端IP等:
body => "Tags: %{tags}\n\nRequest Path: %{request.path}\nClient IP: %{client_ip}\nStatus Code: %{[response][status]}\nContent:\n%{message}"
内容的提问来源于stack exchange,提问作者Linux_Admin
相关产品推荐
相关产品推荐

