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

Spring Boot应用通过Docker Compose部署时无法连接Logstash的问题求助

Spring Boot应用通过Docker Compose部署时无法连接Logstash的问题求助

我最近在尝试用Docker Compose部署一套包含MongoDB、Elasticsearch、Kibana和Logstash的Spring Boot应用,但碰到了个棘手的问题——Spring Boot启动时死活连不上Logstash,报出了连接拒绝的错误:

13:18:21,297 |-WARN in net.logstash.logback.appender.LogstashTcpSocketAppender[logstash] - Log destination logstash/:5001: connection failed. java.net.ConnectException: Connection refused

下面是我的docker-compose.yml片段(部分内容省略):

services:
  mongodb:
    image: mongo
    container_name: mongodb
    environment:
      MONGO_INITDB_ROOT_USERNAME: xxx
      MONGO_INITDB_ROOT_PASSWORD: xxx
      MONGO_INITDB_DATABASE: xxx
    ports:
      - "1905:27017"
    volumes:
      - db_data:/data/db
    networks:
      - chooseone_network
      
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.3.3
    container_name: elasticsearch
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    # 省略其他配置...
    networks:
      - chooseone_network

可能的解决方向,你可以逐一排查:

  • 首先检查Logstash服务是否在docker-compose中定义
    从你给出的配置片段里,我没看到Logstash的服务项!如果压根没把Logstash加入到Compose配置里,那容器根本不会启动,自然连不上。你需要添加类似这样的Logstash服务配置:
logstash:
  image: docker.elastic.co/logstash/logstash:8.3.3
  container_name: logstash
  ports:
    - "5001:5001"
  volumes:
    - ./logstash/config:/usr/share/logstash/config
    - ./logstash/pipeline:/usr/share/logstash/pipeline
  environment:
    - "LS_JAVA_OPTS=-Xms512m -Xmx512m"
  networks:
    - chooseone_network
  depends_on:
    - elasticsearch

注意要和你的Elasticsearch版本保持一致(你用的是8.3.3,Logstash也用同版本避免兼容性问题),并且要加入同一个chooseone_network网络,这样容器之间才能通过服务名互相访问。

  • 确认Spring Boot中Logstash的地址配置是否正确
    你报错里显示的地址是logstash/<unresolved>:5001,这说明服务名解析有问题。在Docker Compose的同一网络下,直接用服务名logstash作为主机名就行,比如你的logback配置里应该写:
<destination>logstash:5001</destination>

Docker会自动把服务名解析为对应容器的IP,不需要手动指定IP。

  • 处理容器启动顺序和服务就绪问题
    有时候Spring Boot启动速度比Logstash快,等Spring Boot去连接的时候,Logstash还没完全启动好,就会报连接拒绝。可以做两个优化:

    1. 在你的Spring Boot服务的docker-compose配置里加上depends_on,确保Logstash先启动:
      depends_on:
        - logstash
      
      不过要注意,depends_on只保证启动顺序,不保证服务已经就绪,所以最好配合重试机制。
    2. 在Logstash的Appender配置里加上重连延迟,比如logback配置:
      <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>logstash:5001</destination>
        <reconnectionDelay>5000</reconnectionDelay> <!-- 5秒后重试 -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
      </appender>
      
      这样连接失败后会自动重试,等Logstash就绪后就能连上了。
  • 检查Logstash的输入配置是否正确
    要确保Logstash的pipeline配置里开启了5001端口的TCP输入,比如在logstash/pipeline/logstash.conf里:

input {
  tcp {
    port => 5001
    codec => json_lines
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "spring-boot-logs-%{+YYYY.MM.dd}"
  }
}

如果没有这个输入配置,Logstash不会监听5001端口,自然无法建立连接。

你可以按照上面的步骤逐一排查,应该能解决连接问题。

备注:内容来源于stack exchange,提问作者Bertug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 15:02:59