You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Logstash中if type条件判断失效问题求助

解决Logstash中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

火山引擎 最新活动