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还没完全启动好,就会报连接拒绝。可以做两个优化:- 在你的Spring Boot服务的
docker-compose配置里加上depends_on,确保Logstash先启动:
不过要注意,depends_on: - logstashdepends_on只保证启动顺序,不保证服务已经就绪,所以最好配合重试机制。 - 在Logstash的Appender配置里加上重连延迟,比如logback配置:
这样连接失败后会自动重试,等Logstash就绪后就能连上了。<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>
- 在你的Spring Boot服务的
检查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

