如何在Spring Boot应用中启用Tomcat日志
Spring Boot 开启内嵌Tomcat生成原生日志文件配置方案
Spring Boot 内嵌Tomcat默认不会生成外部Tomcat部署时logs目录下的host-manager.log、localhost.log、manager.log、访问日志等文件,可通过以下配置实现完全对齐外部Tomcat的日志生成逻辑:
一、基础访问日志快速开启(配置文件方式)
如果只需要生成Tomcat访问日志,直接在项目配置文件中添加参数即可,无需修改代码:
application.yml 配置示例
server: tomcat: basedir: . # 设置Tomcat工作根目录为项目运行目录 accesslog: enabled: true # 开启访问日志 directory: logs # 日志存放目录,对齐外部Tomcat的logs文件夹 prefix: localhost_access_log # 日志文件名前缀 suffix: .log # 日志文件后缀 pattern: common # 沿用外部Tomcat默认日志格式 rename-on-rotate: true
application.properties 配置示例
server.tomcat.basedir=. server.tomcat.accesslog.enabled=true server.tomcat.accesslog.directory=logs server.tomcat.accesslog.prefix=localhost_access_log server.tomcat.accesslog.suffix=.log server.tomcat.accesslog.pattern=common server.tomcat.accesslog.rename-on-rotate=true
- 该配置启动后只会生成
localhost_access_log.*.log访问日志,无法生成主机管理、应用管理类的日志文件。
二、全量Tomcat日志配置(对齐外部Tomcat所有日志文件)
要生成host-manager.log、localhost.log、manager.log三类日志,需要自定义内嵌Tomcat配置,同时配合日志框架做分流:
- 新增Tomcat自定义配置类,注册Tomcat原生日志组件:
import org.apache.catalina.startup.Tomcat; import org.apache.catalina.valves.AccessLogValve; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.File; @Configuration public class TomcatLogConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatLogCustomizer() { return factory -> { // 配置Tomcat工作根目录,logs文件夹将生成在该路径下 String runPath = System.getProperty("user.dir"); factory.setBaseDirectory(new File(runPath)); // 注册Tomcat默认的主机、应用管理监听器,和外部Tomcat初始化逻辑一致 Tomcat.addDefaultUserConfig(factory.getTomcatContextCustomizers()); factory.addContextLifecycleListeners(new org.apache.catalina.startup.HostConfig()); // 自定义访问日志阀,和配置文件开启效果一致 AccessLogValve accessLogValve = new AccessLogValve(); accessLogValve.setDirectory(runPath + File.separator + "logs"); accessLogValve.setPrefix("localhost_access_log"); accessLogValve.setSuffix(".log"); accessLogValve.setPattern("common"); accessLogValve.setEnabled(true); factory.addContextValves(accessLogValve); }; } }
- 配合日志框架做日志分流(以Spring Boot默认集成的Logback为例),在
src/main/resources/logback.xml中添加如下配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 原有业务日志配置保持不变即可 --> <property name="LOG_PATH" value="logs"/> <!-- localhost.log 输出主机、应用部署相关日志 --> <appender name="LOCALHOST_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/localhost.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/localhost.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <!-- host-manager.log 输出虚拟主机管理相关日志 --> <appender name="HOST_MANAGER_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/host-manager.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/host-manager.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <!-- manager.log 输出应用部署管理相关日志 --> <appender name="MANAGER_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/manager.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/manager.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <!-- 绑定Tomcat对应包日志到指定文件 --> <logger name="org.apache.catalina.core.ContainerBase.[Tomcat].[localhost]" level="INFO" additivity="false"> <appender-ref ref="LOCALHOST_FILE"/> </logger> <logger name="org.apache.catalina.manager.host" level="INFO" additivity="false"> <appender-ref ref="HOST_MANAGER_FILE"/> </logger> <logger name="org.apache.catalina.manager" level="INFO" additivity="false"> <appender-ref ref="MANAGER_FILE"/> </logger> </configuration>
若项目使用Log4j2等其他日志框架,无需修改上面的Tomcat配置类代码,参照Logback的分流逻辑,将对应Tomcat组件包的日志输出到目标文件即可。
三、效果验证
启动应用后,会在项目运行根目录下自动生成logs文件夹,里面包含和外部Tomcat完全一致的localhost.log、host-manager.log、manager.log、localhost_access_log.*.log文件:
- IDE启动时,logs文件夹生成在项目根目录
- Jar包部署启动时,logs文件夹生成在Jar包所在同级目录
内容的提问来源于stack exchange,提问作者acsh
相关产品推荐
相关产品推荐

