Logstash中if type条件判断失效问题求助
type字段条件判断不生效的问题 我来帮你排查下这个type条件判断失效的问题,结合你给出的配置片段,咱们一步步来解决:
先修复配置里的明显拼写错误
先看你贴的配置片段——第二个JDBC input的jdbc_driver_class写的是Java::oracle.jdbc.driver.OracleDrive...,明显是截断漏了个r,正确的应该是Java::oracle.jdbc.driver.OracleDriver。这个拼写错误会直接导致第二个input启动失败,要是你测试的刚好是这个有问题的输入源,那type字段根本就没被正确注入,条件判断自然失效。先把这个拼写问题修复,确保两个JDBC输入都能正常启动。
先确认type字段真的存在于事件中
很多时候问题出在"以为字段存在,但实际没有",所以先加个临时的stdout输出,把所有事件的字段都打印出来,确认type字段是否真的被传入了:
output { stdout { codec => rubydebug } }
启动Logstash后,盯着控制台输出,看看事件里有没有"type": "transactions"(以及另一个输入的type值)。如果没有,那要么是JDBC输入因为数据库连接失败等原因没拉到数据,要么是type字段被后续的过滤器给改了/删了。
检查条件判断的语法是否正确
这是新手常犯的错误:Logstash里引用事件字段必须用方括号[],如果你写的是if type == "transactions",那实际上是在引用环境变量type,而不是事件里的type字段!正确的写法应该是:
if [type] == "transactions" { # 你的过滤器或输出逻辑 }
一定要注意这个语法细节,差个方括号结果完全不一样。
更推荐的替代方案:用tags代替type
顺便提一句,type字段在Logstash 7.x之后已经被标记为过时(deprecated)了,官方更推荐用tags或者自定义字段来区分不同的输入源,这样既灵活又符合新版本规范。比如你可以把input配置改成这样:
input { jdbc { jdbc_driver_library => "/opt/logstash/lib/ojdbc8.jar" jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver" # 你的数据库连接信息 statement_filepath => "/etc/logstash/queries/transactions_all.sql" tags => ["transactions"] } jdbc { jdbc_driver_library => "/opt/logstash/lib/ojdbc8.jar" jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver" # 另一个数据源的连接信息 statement_filepath => "/etc/logstash/queries/your_second_query.sql" tags => ["another_data_source"] } }
之后的条件判断就可以写成:
if "transactions" in [tags] { # 处理交易数据的逻辑 }
这种方式比type更可靠,也避免了使用过时字段的风险。
检查过滤器是否意外修改了type字段
最后,检查你管道里的所有过滤器,比如mutate插件有没有不小心删除或覆盖了type字段。比如如果有这样的配置:
filter { mutate { remove_field => ["type"] } }
那后续的条件判断肯定找不到type字段了。仔细排查所有过滤器逻辑,确保没有意外修改type的操作。
内容的提问来源于stack exchange,提问作者Michael Dz




