[英]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.