如何使用Logstash Grok过滤器筛选含ERR_AUTH_PORTAL_USER的JSON日志
解决Logstash筛选包含特定错误码日志的问题
首先,你的原始日志是JSON格式,所以第一步应该先使用json过滤器解析整个日志条目,而不是直接用grok去匹配message字段——因为此时message是完整的JSON字符串,直接grok匹配会失败,导致后续的条件判断也无法生效。
以下是修正后的完整配置,我会逐部分解释:
input { file { type => vampserror path => "/home/ampsErrorLog/getError/*" start_position => "beginning" } } filter { # 第一步:解析JSON格式的日志,将所有字段提取到Logstash的事件中 json { source => "message" remove_field => "message" # 可选:解析后移除原始message字段,简化事件结构 } # 可选:如果需要进一步解析msg字段里的详细内容,可以添加grok规则 grok { match => { "msg" => "err:%{DATA:error_code},tenantid:%{NUMBER:tenantid:int},reason:%{DATA:reason},code:%{DATA:error_subcode},username:%{DATA:username},venueid:%{NUMBER:venueid:int},devicemac:%{DATA:devicemac},apmac:%{DATA:apmac},ssid:%{DATA:ssid},timestamp:%{DATA:log_timestamp}" } } # 筛选出msg字段包含ERR_AUTH_PORTAL_USER的日志 if "ERR_AUTH_PORTAL_USER" not in [msg] { drop {} # 丢弃不符合条件的日志,仅保留目标日志 } } output { stdout { codec => rubydebug } }
关键修正点说明:
- JSON解析是核心:添加
json过滤器后,原始日志里的level、msg、time等字段会被直接提取到Logstash事件中,这样后续的条件判断才能正确访问[msg]字段。 - 条件判断优化:用
if "ERR_AUTH_PORTAL_USER" not in [msg] { drop {} }直接丢弃不符合要求的日志,比只保留空逻辑块更高效,确保只有目标日志进入输出环节。 - 可选的Grok增强:如果需要把
msg里的子字段(比如tenantid、reason、error_code等)单独提取成独立字段,方便后续分析或存储,可以使用配置里的grok规则,它会把每个键值对映射成对应的结构化字段。
测试小技巧:
你可以先暂时注释掉drop {}语句,用rubydebug输出所有解析后的事件,确认msg字段已经被正确提取,然后再恢复筛选规则,验证只有包含ERR_AUTH_PORTAL_USER的日志被保留。
内容的提问来源于stack exchange,提问作者SashaAlex
相关产品推荐
相关产品推荐

