Logstash 如果类型条件不起作用
Logstash if type condition not working
在我的 Logstash 中,我有一个管道 运行s 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" {
永远不会为真,第二个条件可以正常工作。我尝试在没有 if 条件的情况下仅使用 transactions
索引 运行 管道并且它工作正常。出于某种原因,这个 if 条件不起作用,但为什么呢?
我找到了一个荒谬的解决方法,但如果我遇到另一个有这个问题的索引,它就不会起作用:
if [type] == "db_stats_ts" { .. } else {
elasticsearch {
index => "servicenow_oraaspoc-%{+YYYY.MM.dd}"
hosts => ["localhost:9200"]
}
}
ike 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"]
}
}
}
在我的 Logstash 中,我有一个管道 运行s 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" {
永远不会为真,第二个条件可以正常工作。我尝试在没有 if 条件的情况下仅使用 transactions
索引 运行 管道并且它工作正常。出于某种原因,这个 if 条件不起作用,但为什么呢?
我找到了一个荒谬的解决方法,但如果我遇到另一个有这个问题的索引,它就不会起作用:
if [type] == "db_stats_ts" { .. } else {
elasticsearch {
index => "servicenow_oraaspoc-%{+YYYY.MM.dd}"
hosts => ["localhost:9200"]
}
}
ike 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"]
}
}
}