Logstash输出条件语句异常:else分支不生效问题求助
我来帮你梳理下这个问题的排查思路和解决方案,你遇到的情况很可能是几个细节没处理到位导致的:
1. 先确认事件的实际字段内容
有时候我们默认[message]字段内容符合预期,但Logstash在处理流程中可能已经修改了这个字段(比如经过filter插件处理),或者字段名存在嵌套(比如是[fields][message])。
你可以先修改stdout的codec为rubydebug,打印完整的事件内容,确认message字段的实际格式:
output{ stdout{ codec => rubydebug } # 保留原有的elasticsearch配置 }
运行后查看控制台输出,确认message字段的内容和你预期的一致,没有被篡改、截断,也不存在字段名错误的情况。
2. 优化正则表达式(避免重复与转义问题)
你写的两个正则可以合并成一个,而且Logstash中推荐用//包裹正则表达式(而非字符串),这样能减少转义出错的概率:
if [message] =~ /\D\[INFO\s?\]:.*\[ELASTICSEARCH\].*/ { # beat-tpms索引配置 } else { # tpms-system索引配置 }
这里用\s?匹配INFO后面可选的空格,同时用//包裹正则,避免字符串转义带来的潜在问题。
3. 测试else分支本身是否正常
先暂时把if条件改成一个肯定不匹配任何日志的规则,比如:
output{ stdout{ codec => rubydebug } if [message] =~ /THIS_IS_A_TEST_PATTERN/ { elasticsearch { hosts => ["https://localhost:9200"] user => logstash password => logstash ssl => true ssl_certificate_verification => false document_id => "%{fingerprint}" index => "beat-tpms" } }else{ elasticsearch { hosts => ["https://localhost:9200"] user => logstash password => logstash ssl => true ssl_certificate_verification => false document_id => "%{fingerprint}" index => "tpms-system" } } }
如果此时其他日志能正常写入tpms-system索引,说明是原来的正则表达式逻辑有问题(比如某些非INFO日志意外匹配了正则);如果还是无法写入,那就要排查Elasticsearch的配置问题:
- 确认
tpms-system索引是否存在,Logstash用户是否有写入权限 - 检查
%{fingerprint}字段是否存在,如果该字段缺失,可能导致文档写入失败(可以暂时去掉document_id配置测试)
4. 查看Logstash的错误日志
Logstash的默认日志路径是logs/logstash-plain.log,里面会记录输出到Elasticsearch时的错误信息,比如认证失败、索引无法创建、字段缺失导致的异常等,这些都可能导致日志无法写入目标索引。
5. 排查事件是否到达output阶段
如果上述步骤都没问题,那要确认非INFO日志是否真的到达了output阶段:比如在filter阶段有没有被drop或者mutate插件意外处理掉?可以在filter末尾添加一个stdout输出,确认事件能正常流转到output。
内容的提问来源于stack exchange,提问作者codeKid

