你能帮我在logstash中输入RabbitMQ吗? 我的应用程序将代码版本发送到 rabbitmq,然后它会存储在弹性堆栈中。 对于rabbitmq中的应用程序已创建队列 名称:app_version_queue; 类型:经典; 耐用:真实
然后使用该配置配置了 logstash:
input {
rabbitmq {
id => "rabbitmyq_id"
# connect to rabbit
host => "localhost"
port => 5672
vhost => "/"
# INPUT - PRODUCERS
key => "app_version_queue"
# OUTPUT - CONSUMER
# queue for logstash
queue => "logstash"
auto_delete => false
# Exchange for logstash
exchange => logstash
exchange_type => direct
durable => "true"
# No ack will boost your perf
ack => false
}
}
output {
elasticsearch {
hosts => [ "elasticsearch:9200" ]
index => "app_version-%{+YYYY.MM.dd}"
}
}
它起作用了,但是现在,在 RabbitMQ 控制台中,我在表 Queued messages 中看到 准备就绪:914,444 未确认:0 总计:914,444
我在 rabbitmq 集群上的磁盘空间在 3 天内就用完了。 重启rabbitmq服务器后,所有空间都可用了。
更新: 所有的原因,为什么我这样做,我想从那个链 app=>rabbit=>nifi=>elastic 中删除 NIFI 我想做:app=>rabbit=>logstash=>elastic
我尝试停止 NIFI 发送,但消息没有离开。
答案 0 :(得分:0)
听起来好像你已经创建了两次基础设施:
您需要的是三件事:
你拥有的是所有这些:
logs
(手动创建)的交换,您的应用程序将消息发布到该交换。app_version_queue
的队列(手动创建),没有任何消耗。logs
传送到 app_version_queue
,然后它永远留在那里。logstash
的交换(由 LogStash 创建),它不会向其发布消息。logstash
的队列(由 LogStash 创建),LogStash 从中使用消息。logstash
交换到 logstash
队列的绑定(由 LogStash 创建),它不执行任何操作,因为没有消息发布到该交换。logs
交换器到 logstash
队列的绑定(手动创建),实际上是从您的应用程序传递消息。因此,对于三件事(交换、队列和绑定)中的每一项,您需要:
例如,您可以保留名称 logs
和 app_version_queue
,并手动创建所有内容。
那么您的 LogStash 应用程序将如下所示:
input {
rabbitmq {
id => "rabbitmyq_id"
# connect to rabbit
host => "localhost"
port => 5672
vhost => "/"
# Consume from existing queue
queue => "app_version_queue"
# No ack will boost your perf
ack => false
}
}
另一方面,您可以只创建 logs
交换,并让 LogStash 创建队列和绑定,如下所示:
input {
rabbitmq {
id => "rabbitmyq_id"
# connect to rabbit
host => "localhost"
port => 5672
vhost => "/"
# Create a new queue
queue => "logstash_processing_queue"
durable => "true"
# Take a copy of all messages with the "app_version_queue" routing key from the existing exchange
exchange => "logs"
key => "app_version_queue"
# No ack will boost your perf
ack => false
}
}
或者您可以让 LogStash 创建所有,并确保您的应用程序发布到正确的交易所:
input {
rabbitmq {
id => "rabbitmyq_id"
# connect to rabbit
host => "localhost"
port => 5672
vhost => "/"
# Create a new queue
queue => "logstash_processing_queue"
durable => "true"
# Create a new exchange; point your application to publish here!
exchange => "log_exchange"
exchange_type => "direct"
# Take a copy of all messages with the "app_version_queue" routing key from the new exchange
key => "app_version_queue"
# No ack will boost your perf
ack => false
}
}
我可能会选择中间的选项:交换是应用程序部署要求的一部分(如果不能在那里发布,它将产生错误),但由于不同的原因,任何数量的队列都可能绑定到它(在不需要设置 ElasticSearch 的测试环境中可能根本没有)。