1

在我的 Logstash 中,我有一个运行 2 个 SQL 查询来下载数据的管道。下面是管道的conf文件:

input {

  jdbc {
        jdbc_driver_library => "/opt/logstash/lib/ojdbc8.jar"
        jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
        #Hidden db connection details
        statement_filepath => "/etc/logstash/queries/transactions_all.sql"
        type => "transactions"
  }
  jdbc {
        jdbc_driver_library => "/opt/logstash/lib/ojdbc8.jar"
        jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
        #Hidden db connection details
        statement_filepath => "/etc/logstash/queries/snow_db_stats_ts_all.sql"
        type => "db_stats_ts"
  }

output{
       if [type] == "transactions" {
         elasticsearch {
             index => "servicenow_oraaspoc-%{+YYYY.MM.dd}"
             hosts => ["localhost:9200"]
         }
       }
       if [type] == "db_stats_ts" {
        elasticsearch {
            index => "snow_db_stats_ts-%{+YYYY.MM.dd}"
            hosts => ["localhost:9200"]
        }
       }
  stdout {     
          codec => rubydebug
  }

}

我可以在控制台中看到一切正常,除了索引类型transactions永远不会保存到 Elasticsearch。这个条件if [type] == "transactions" {永远不会成立,第二个条件没有任何问题。我尝试在transactions没有 if 条件的情况下仅使用索引运行管道,并且效果很好。出于某种原因,如果条件不起作用,但为什么?

我找到了一个荒谬的解决方法,但如果我遇到另一个索引存在此问题,它将无法正常工作:

   if [type] == "db_stats_ts" { .. } else {
       elasticsearch {
          index => "servicenow_oraaspoc-%{+YYYY.MM.dd}"
          hosts => ["localhost:9200"]
       }
   }
4

1 回答 1

3

就像 Thomas Decaux 提到的,您可以使用标签而不是类型,顺便说一句,您可以为每个 jdbc 块使用任意数量的标签。使用以下示例中的标签从配置文件中删除类型:

tags => ["transactions"]

tags => ["db_stats_ts"]

您的输出块应如下所示:

output{
       if "transactions" in [tags] {
         elasticsearch {
           index => "servicenow_oraaspoc-%{+YYYY.MM.dd}"
           hosts => ["localhost:9200"]
         }
       }
       if "db_stats_ts" in [tags] {
        elasticsearch {
          index => "snow_db_stats_ts-%{+YYYY.MM.dd}"
          hosts => ["localhost:9200"]
        }
       }
}
于 2018-05-09T12:37:08.017 回答