Logstash Grok判断%符号配置异常导致Kibana无日志问题求助
问题根因
Logstash 配置语法不支持在 grok 过滤器块内部嵌套条件判断语句。你将判断 message 字段是否包含%的if逻辑写在了grok {}块内部,会导致filter插件加载失败、日志处理链路中断,因此Kibana无法接收到日志。
修复方案
将二次Grok解析的逻辑拆分为独立的grok过滤器,放在首次Grok解析的外层,外层套条件判断即可,修正后的完整配置如下:
filter { if [solution] == "horizon" { # 首次基础Grok解析 grok { id => "horizon_base_grok" match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log-level} %{DATA:horizon.component} %{DATA:horizon.process}:%{GREEDYDATA:message}" } overwrite => ["message"] } # 条件判断放在grok块外部,匹配到%时执行二次解析 if '%' in [message] { grok { id => "horizon_free_mem_grok" match => { "message" => "%{DATA:free_mem_string} < %{NUMBER:free_mem_value:int}%{GREEDYDATA:message}" } overwrite => ["message"] # 可选配置:如果二次匹配失败不添加失败标签,避免影响后续逻辑 tag_on_failure => [] } } if [log-level] not in [ "ERROR","WARN","FATAL" ] { drop {} } } date { id => "horizon_date" match => [ "timestamp","ISO8601" ] add_tag => [ "horizon_date" ] } }
修改说明
- 移除了嵌套在首次
grok块内部的非法条件判断逻辑 - 二次Grok解析使用独立的过滤器实现,和原始需求完全一致:首次解析完成后,若
message包含%则执行二次匹配提取内存相关字段 - 新增可选配置
tag_on_failure => [],可避免二次Grok匹配失败时给日志打上_grokparsefailure标签,不影响正常日志的流转
内容的提问来源于stack exchange,提问作者JF_LTQ
相关产品推荐
相关产品推荐

