You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署ELK+Kafka时Logstash报ES不可达连接拒绝错误

问题原因

错误日志已经明确指向配置错误:Logstash 尝试连接的 Elasticsearch 地址是 http://kafka:9200/,但9200是Elasticsearch的服务端口,Kafka服务本身不监听这个端口,自然会返回连接拒绝。
你在宿主机能通过localhost:9200访问Elasticsearch,是因为docker-compose把Elasticsearch容器的9200端口映射到了宿主机,但在docker自定义的tweetapp-network内部,容器之间是通过服务名做域名解析互相访问的:

  • Kafka服务的内部域名为kafka,仅监听9092端口
  • Elasticsearch服务的内部域名为elasticsearch,监听9200端口
    你在logstash的输出配置里把Elasticsearch的主机名错写成了kafka,才导致Logstash找错了服务地址。
修复步骤
  • 修改logstash配置文件中elasticsearch输出段的hosts配置,将错误的kafka:9200改为正确的服务地址:
output {
   elasticsearch {
      hosts => ["elasticsearch:9200"]
      index => "tweetapp"
      workers => 1
    }
}
  • 检查配置挂载路径:你docker-compose里写的Logstash配置挂载路径是.\logstash:/usr/share/logstash/pipeline/,如果是Windows环境要确认相对路径识别正常,同时要保证你本地logstash目录下的配置文件后缀是.conf,Logstash默认只会加载pipeline目录下后缀为.conf的配置文件,后缀不对会导致配置不生效。
  • 重启Logstash容器加载新配置,在docker-compose.yml所在目录执行命令:
    docker-compose restart logstash
  • 注意depends_on配置仅能控制容器的启动顺序,无法保证容器内的服务完全就绪,如果重启后短时间内还有连接报错,等Elasticsearch完全启动(单节点ES一般启动需要10-30秒,可进入Logstash容器执行curl elasticsearch:9200验证连通性)后报错就会消失,长期使用可以给Elasticsearch加健康检查,让Logstash等ES服务真正就绪后再启动。
验证方法

查看Logstash容器日志,不再出现HostUnreachableError连接拒绝的报错后,往Kafka的tweetapp-logs主题发送一条测试日志,等待数秒后访问Elasticsearch的tweetapp索引,能查到对应的日志文档就说明整个采集链路正常。

内容的提问来源于stack exchange,提问作者VA splash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:36:20