繁体   English   中英

具有多个 kafka 输入的 Logstash

[英]Logstash with multiple kafka inputs

我正在尝试过滤来自多个主题的 kafka 事件,但是一旦过滤了来自一个主题的所有事件,logstash 就无法从另一个 kafka 主题中获取事件。 我正在使用具有 3 个分区和 2 个复制的主题这是我的 logstash 配置文件

input {
    kafka{              
        auto_offset_reset => "smallest"
        consumer_id => "logstashConsumer1"          
        topic_id => "unprocessed_log1"
        zk_connect=>"192.42.79.67:2181,192.41.85.48:2181,192.10.13.14:2181"
        type => "kafka_type_1"
}
kafka{              
    auto_offset_reset => "smallest"
    consumer_id => "logstashConsumer1"          
    topic_id => "unprocessed_log2"
    zk_connect => "192.42.79.67:2181,192.41.85.48:2181,192.10.13.14:2181"
    type => "kafka_type_2"
}
}
filter{
    if [type] == "kafka_type_1"{
    csv { 
        separator=>" "
        source => "data"        
    }   
}
if [type] == "kafka_type_2"{    
    csv { 
        separator => " "        
        source => "data"
    }
}
}
output{
    stdout{ codec=>rubydebug{metadata => true }}
}

这是一个很晚的回复,但是如果您想输入多个主题并输出到另一个 kafka 多个输出,您可以执行以下操作:

input {
  kafka {
    topics => ["topic1", "topic2"]
    codec => "json"
    bootstrap_servers => "kafka-broker-1:9092,kafka-broker-2:9092,kafka-broker-3:9092"
    decorate_events => true
    group_id => "logstash-multi-topic-consumers"
    consumer_threads => 5
  }
}
    
output {
   if [kafka][topic] == "topic1" {
     kafka {
       codec => "json"
       topic_id => "new_topic1"
       bootstrap_servers => "output-kafka-1:9092"
     }
   }
   else if [kafka][topic] == "topic2" {
      kafka {
       codec => "json"
       topic_id => "new_topic2"
       bootstrap_servers => "output-kafka-1:9092"
      }
    }
}

在详细说明您的引导服务器时要小心,并给出您的 kafka 广告侦听器的名称。

Ref-1: https : //www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html#plugins-inputs-kafka-group_id

Ref-2: https : //www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html#plugins-inputs-kafka-decorate_events

上一个答案对我不起作用,似乎它无法识别输出中的条件语句,这是我的答案,至少对于我在输入中为 Kafka 消费者和文档(在我的如果它们是日志)被摄取到与其消费者主题相关的单独索引中。

 input { kafka { group_id => "35834" topics => ["First-Topic"] bootstrap_servers => "localhost:9092" codec => json tags => ["First-Topic"] } kafka { group_id => "35834" topics => ["Second-Topic"] bootstrap_servers => "localhost:9092" codec => json tags => ["Second-Topic"] } } filter { } output { if "Second-Topic" in [tags]{ elasticsearch { hosts => ["localhost:9200"] document_type => "_doc" index => "logger" } stdout { codec => rubydebug } } else if "First-Topic" in [tags]{ elasticsearch { hosts => ["localhost:9200"] document_type => "_doc" index => "saga" } stdout { codec => rubydebug } } }

可能这就是您需要的:

input {
  kafka {
    client_id => "logstash_server"
    topics => ["First-Topic", "Second-Topic"]
    codec => "json"
    decorate_events = true
    bootstrap_servers => "localhost:9092"
  }
}

filter { }

output {
  if [@metadata][kafka][topic] == "First-Topic" {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "logger"
    }
  }
  else if [@metadata][kafka][topic] == "Second-Topic" {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "saga"
    }
  }
  else {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "catchall"
    }
  }
}

如果 Kafka 的两个独立输入指向同一个 Bootstrap,则不需要它们,您只需指定要从 Logstash 读取的主题列表。

如果需要,您还可以添加“stdout { codec => rubydebug }”,但这通常在调试时使用,在会引起大量噪音的生产环境中。 'document_type => "_doc"' 如果你愿意也可以使用,但不是必须的,在 Elasticsearch (8.0) 的新版本中,这个选项已经被弃用,我会干脆去掉它。

而且我还在 output 添加了最后的“else”语句,如果出于某种原因任何语句匹配,将事件发送到任何其他默认索引也很重要,在本例中为“catchall”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM