Docker容器中Tomcat部署SpringBoot War包无法生成自定义日志求助
解决Docker中Tomcat部署Spring Boot war包时Logback日志文件未生成的问题
问题根源
本地Tomcat从bin目录启动,Web应用的相对路径../logs会指向Tomcat根目录下的logs文件夹(如tomcat/logs),符合预期;但Docker容器中Tomcat的默认工作目录是/usr/local/tomcat,Logback配置的../logs会指向/usr/local/logs(而非预期的/usr/local/tomcat/logs),且该目录默认不存在,导致日志无法写入,只能输出到控制台。
解决方案
修改logback.xml中的日志根路径配置,使用Tomcat自动注入的系统变量${catalina.base}指定日志目录,该变量在本地和Docker环境中都会被设置为Tomcat的根目录路径,确保跨环境一致。
修改后的logback.xml关键配置:
<configuration> <property name="APPLICATION_NAME" value="test-app" /> <!-- 用catalina.base指定Tomcat根目录下的logs文件夹 --> <property name="LOG_ROOT" value="${catalina.base}/logs" /> <property name="LOG_FILE_NAME" value="${APPLICATION_NAME}.server.log" /> <!-- 以下appender、logger配置保持不变 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%date [%thread] [%-5level] %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_ROOT}/${LOG_FILE_NAME}</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_ROOT}/${LOG_FILE_NAME}-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>5MB</maxFileSize> <maxHistory>18</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="com.test.APP" level="INFO" additivity="false"> <appender-ref ref="FILE" /> </logger> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
验证步骤
- 重新打包项目:
mvn clean package
- 重新构建Docker镜像:
docker build -t test:v2 .
- 启动容器:
docker run -d -p 8080:8080 test:v2
- 进入容器检查日志文件:
docker exec -it <容器ID> ls /usr/local/tomcat/logs
此时应能看到test-app.server.log文件。
额外优化(可选)
如果需要将日志持久化到宿主机,启动容器时挂载日志目录:
docker run -d -p 8080:8080 -v /宿主机本地路径/tomcat-logs:/usr/local/tomcat/logs test:v2
内容的提问来源于stack exchange,提问作者user2755407
相关产品推荐
相关产品推荐

