1、场景
springboot单体项目,采用docker-swarm进行部署,使用docker stack run命令执行运行并生成对应的容器,但是发现通过docker logs -f containerId可以查看到项目运行日志,但是通过挂载的日志文件路径发现日志不存在,甚至日志文件都没有生成
2、场景分析
首先查看项目的docker-compose.yml编排文件,如下图所示:
对比编排文件,启动好的容器中已经存在了logback.xml日志配置文件,而且volumes目录挂载也没有问题,不生效的话,可能就是指定的日志配置文件没有生效,而是使用了构建的镜像里面使用的jar里面带的logback.xml配置文件,如是开始验证
调整指定的外部logback.xml配置文件日志打印级别为INFO,因为原本jar包自带的logback.xml日志级别为DEBUG,可以通过docker logs -f containerId查看控制台日志的打印级别,发现容器启动之后,日志打印中出现了debug级别日志,如是可以判定使用的是jar包自带的logback.xml日志配置,如是考虑在项目配置文件application.yml中进行指定logback.xml配置文件,因为application.yml使用的是指定的配置文件,logback.xml和application.xml在容器中的位置是在同一个目录下,如下图:
因为springboot配置文件中有一个配置项: logging.config可以用来指定配置文件,所以修改配置文件如下:
由于logback.xml和application.yml在容器中是处于同一目录下,所以直接指定logback.xml为logging.config的值,修改好配置之后,再次启动容器,发现日志在日志文件中正常打印了;
3、场景总结
总的来说,该场景下日志在日志文件中不生效的原因就是因为读取了jar包下面的日志配置,导致外部指定的logback.xml日志配置文件不生效,需要手动在生效的项目配置文件中显式指定日志配置文件