Docker运行的JHipster生产模式应用无法在JHipster-console生成日志
解决Docker部署JHipster生产应用后Kibana无法获取日志的问题
这种情况我碰到过好几次,核心问题基本都是Docker网络隔离导致的,毕竟宿主机、Docker容器、Vagrant虚拟机这几层网络容易搞混,咱们一步步排查:
1. 先搞懂容器里怎么访问宿主机的Logstash
你在application-prod.yml里写localhost或者宿主机物理IP都没用——在Docker容器里,localhost指的是容器自己,而Vagrant的Ubuntu宿主机对于容器来说,是Docker网络的网关地址。
- 先查Docker网关:在Ubuntu宿主机上跑这条命令:
一般会得到类似docker inspect bridge | grep Gateway"Gateway": "172.17.0.1"的结果,这个就是容器能访问到宿主机的地址。 - 把application-prod.yml里的
logging.logstash.host改成这个网关地址,重新打包镜像或者挂载配置文件到容器里,再启动试试。
2. 确认Logstash的端口是对外开放的
JHipster默认用5000端口接收Logstash日志,得确保两个点:
- JHipster-console容器已经把5000端口映射到宿主机:跑
docker ps看容器的端口列,必须有0.0.0.0:5000->5000/tcp这样的映射,如果没有,启动容器时要加-p 5000:5000参数。 - Ubuntu宿主机的防火墙没挡住这个端口:跑
sudo ufw status,看5000/tcp是否在允许列表里,没开的话执行sudo ufw allow 5000/tcp。
3. 更稳妥的方案:把两个容器放到同一个Docker网络
如果网关地址的方法不好使,直接让JHipster应用容器和JHipster-console在同一个自定义网络里,这样它们可以用容器名互相访问,不用管IP的问题:
- 创建自定义网络:
docker network create jhipster-shared-net - 重启JHipster-console时加入这个网络(替换成你原来的启动命令):
docker run --network jhipster-shared-net --name jhipster-console [你的其他启动参数] - 启动JHipster生产应用容器时也加入这个网络,然后把application-prod.yml里的
logging.logstash.host改成jhipster-console(就是这个容器的名字),这样容器之间就能直接通信了。
4. 验证Logstash本身是否正常工作
有时候问题不在JHipster应用,而是Logstash没正常接收日志:
- 在Ubuntu宿主机上跑这条命令发测试日志:
echo "test log from host" | nc localhost 5000 - 然后去Kibana里刷新,看能不能找到这条测试日志。如果能找到,说明Logstash没问题,那就是JHipster应用容器的配置或网络问题;如果找不到,就得检查JHipster-console里的Logstash配置了。
另外还要注意:生产模式下,有没有用环境变量覆盖了配置文件的设置?比如启动容器时如果加了-e LOGGING_LOGSTASH_ENABLED=false,那application-prod.yml里的enabled: true就会被覆盖,这点一定要检查!
内容的提问来源于stack exchange,提问作者J.K.J
相关产品推荐
相关产品推荐

