SpringBoot内置Tomcat配置详解
SpringBoot内置Tomcat配置详解
SpringBoot框架内置Tomcat,使得开发变得非常方便。随着SpringBoot框架的升级,内置的Tomcat版本也会相应更新。本文将基于SpringBoot 2.2.10版本,详细介绍如何查看内置Tomcat的版本、自动配置位置、支持的其他Web容器、Tomcat客户端访问日志配置、切换Web容器的方法、Tomcat参数优化等内容。
如何查看SpringBoot的内置Tomcat版本?
要查看SpringBoot内置Tomcat的版本,可以通过以下方式:
- 在项目中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
- 在代码中通过反射获取Tomcat版本:
import org.apache.catalina.util.ServerInfo;
public class TomcatVersion {
public static void main(String[] args) {
System.out.println(ServerInfo.getServerInfo());
}
}
SpringBoot的自动配置Tomcat在哪个包下?
SpringBoot的自动配置Tomcat相关代码位于spring.boot.autoconfigure
包下。
SpringBoot的内置Web容器是Tomcat,还支持哪几种,是怎么设计扩展的?
SpringBoot默认使用Tomcat作为内置Web容器,但同时也支持Jetty和Undertow。这些容器的配置信息主要在ServerProperties
中定义。
ServerProperties
类使用@ConfigurationProperties
注解,前缀为"server",并设置ignoreUnknownFields
为true,以忽略未知的字段配置。
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
Web容器的规范由WebServer
接口定义:
public interface WebServer {
void start() throws WebServerException;
void stop() throws WebServerException;
int getPort();
}
查看实现类org.springframework.boot.web.embedded.tomcat.TomcatWebServer
的构造函数:
public TomcatWebServer(Tomcat tomcat) {
this(tomcat, true);
}
在初始化过程中,会使用Apache的Logging组件打印日志,并获取端口描述信息。如果不单独配置,将使用本地默认的8080端口。
Tomcat的客户端访问日志如何配置?并保留一定时间
在application.yml
中进行如下配置:
tomcat:
basedir: /var/log/tomcat
accesslog:
enabled: true
directory: accessLog
pattern: '"%t","%{Http_X_Forwarded_For}i","%H","%m","%U%q","%s","%A","%D"'
prefix: access
suffix: .log
rename-on-rotate: true
max-days: 30
file-date-format: yyyy-MM-dd
内置Tomcat如何切换Jetty等?
要将内置Tomcat切换为Jetty,需要在pom.xml
中进行如下配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
这种切换机制是通过Spring的条件注解实现的。当类路径下存在Tomcat的类时,会条件注入相应的Bean。源码参考:EmbeddedWebServerFactoryCustomizerAutoConfiguration
。
优化Tomcat的最大连接数和线程数以及其他参数优化
要开启HTTPS连接并添加证书路径,可以在application.yml
中进行如下配置:
server:
port: 8443
ssl:
key-store: classpath:keystore.p12
key-store-password: password
key-password: password
添加控制台的日志行号打印
在application.yml
中添加如下配置:
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread]%-5level-%highlight(%C-%M:%L)-%msg%n'
整合Log4j2日志
默认情况下,SpringBoot使用Logback作为日志组件,但Log4j2更通用且性能更佳。要切换到Log4j2,需要在pom.xml
中进行如下配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
然后在src/main/resources
目录下创建log4j2.xml
配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="WARN" monitorInterval="60">
<Properties>
<property name="APP_NAME">walk-boot</property>
<property name="LOG_PATH">./logs/${APP_NAME}</property>
<property name="PATTERN_CONSOLE">[%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{bright,green}][%highlight{%p}][%style{%t}{bright,blue}][%style{%C}{bright,yellow}]: %msg%n%style{%throwable}{red}</property>
<property name="PATTERN_FILE">[%d{yyyy-MM-dd HH:mm:ss.SSS}][%thread]%-5level-[%C-%M:%L]-%msg%n</property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${PATTERN_CONSOLE}" disableAnsi="false" noConsoleNoAnsi="false"/>
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<RollingFile name="Service" fileName="${LOG_PATH}/${APP_NAME}.log" filePattern="${LOG_PATH}/$${date:yyyy-MM}/${APP_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
<PatternLayout pattern="${PATTERN_FILE}"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<Loggers>
<logger name="com.boot.skywalk" level="info" additivity="false">
<AppenderRef ref="Service"/>
</logger>
<root level="info">
<AppenderRef ref="Console"/>
</root>
</Loggers>
</Configuration>
通过以上配置,可以实现控制台日志打印、日志文件格式化以及日志压缩等功能。对于更高级的日志配置,如SSL开启、多端口监听等,可以进一步参考SpringBoot的默认配置文件spring-configuration-metadata.json
和自动配置文件spring.factories
。