问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SpringBoot内置Tomcat配置详解

创作时间:
作者:
@小白创作中心

SpringBoot内置Tomcat配置详解

引用
CSDN
1.
https://blog.csdn.net/HcJsJqJSSM/article/details/113091632

SpringBoot框架内置Tomcat,使得开发变得非常方便。随着SpringBoot框架的升级,内置的Tomcat版本也会相应更新。本文将基于SpringBoot 2.2.10版本,详细介绍如何查看内置Tomcat的版本、自动配置位置、支持的其他Web容器、Tomcat客户端访问日志配置、切换Web容器的方法、Tomcat参数优化等内容。

如何查看SpringBoot的内置Tomcat版本?

要查看SpringBoot内置Tomcat的版本,可以通过以下方式:

  1. 在项目中添加依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
  1. 在代码中通过反射获取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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号