一、SpringBoot框架内置Tomcat,开发非常方便,随着SpringBoot的框架升级,内置Tomcat也更新版本。本文SpringBoot框架版本:2.2.10。

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

      2、SpringBoot的自动配置Tomcat在哪个包下?

           spring.boot.autoconfigure

       3、SpringBoot的内置Web容器是Tomca,还支持哪几种,是怎么设计扩展的?

      默认的属性都在ServerProperties中配置。

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true),忽略不识别的字段配置

WebServer接口定义Web容器的规范
public interface WebServer {

	/**
	 * Starts the web server. Calling this method on an already started server has no
	 * effect.
	 * @throws WebServerException if the server cannot be started
	 */
	void start() throws WebServerException;

	/**
	 * Stops the web server. Calling this method on an already stopped server has no
	 * effect.
	 * @throws WebServerException if the server cannot be stopped
	 */
	void stop() throws WebServerException;

	/**
	 * Return the port this server is listening on.
	 * @return the port (or -1 if none)
	 */
	int getPort();

}

看实现类:org.springframework.boot.web.embedded.tomcat

看一个TomcatWebServer的

跟进去看一下Tomcat的类,注入内置Tomcat后,是自动启动的。

	public TomcatWebServer(Tomcat tomcat) {
		this(tomcat, true);
	}

在看一下初始化打出端口,使用的Apache的Logging组件打出的日志。

获取端口描述信息,如果不单独配置就获取本地默认的8080端口的。

      4、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

       5、内置Tomcat如何切换Jetty等?

        <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>

 引入Jetty包,一般都是用Tomcat的。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>

为啥可以根据倒包去依赖就可以实现Web容器的自动切换?Spring的条件注解,当类路径下存在Tomcat的类,就会条件注入这个Bean

源码参考:EmbeddedWebServerFactoryCustomizerAutoConfiguration

       6、优化Tomcat的最大连接数和线程数以及其他参数优化?

开启https连接,添加证书路径,以及生产环境证书密码加密等

二、添加控制台的日志行号打印

1、application.yml中添加.

logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread]%-5level-%highlight(%C-%M:%L)-%msg%n'

比较容易分析源码一些了

三、整合Log4j2日志

1、pom文件,默认是logback日志组件,log4j2更通用,性能更佳.

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- springboot默认是用logback的日志框架的 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 引入log4j2依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency> 

 2、log4j2.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="WARN" monitorInterval="60">
    <!--变量配置-->
    <Properties>
        <!--应用名称-->
        <property name="APP_NAME">walk-boot</property>
        <!--日志存放路径,当前路径还是相对路径 ,大型项目各个微服务可以统一模块,比如/var/log/xxx,单独挂磁盘,确保服务日志目录正常读写 -->
        <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>
        <!--可归档文件
            1. fileName: 日志存储路径
            2. filePattern: 历史日志封存路径。其中%d{yyyy-MM-dd}表示了日志的时间单位是天,log4j2自动识别zip等后缀,表示历史日志需要压缩
        -->
        <!--控制台-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式:
                1.不设置默认为: %m%n
                2.disableAnsi="false" noConsoleNoAnsi="false" 配置开启支持%highlight彩色日志
            -->
            <PatternLayout pattern="${PATTERN_CONSOLE}" disableAnsi="false" noConsoleNoAnsi="false"/>
            <!--只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <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">
            <!--输出日志的格式, 不设置默认为:%m%n-->
            <PatternLayout pattern="${PATTERN_FILE}"/>
            <!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--归档设置-->
            <Policies>
                <!--按时间间隔归档:
                    1. interval=时间间隔, 单位由filePattern的%d日期格式指定, 此处配置代表每一天归档一次
                    2. modulate="true" 是否对interval取模,决定了下一次触发的时间点
                -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!-- 按照日志文件的大小: size表示当前日志文件的最大size,支持单位:KB/MB/GB-->
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <!-- 历史日志配置: 该属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
    </Appenders>
    <!--Loggers配置-->
    <Loggers>
        <!--
        注意点:
        1. logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等:
           (1). name: 用来指定该logger所适用的类或者类所在的包全路径,继承自Root节点.
           (2). AppenderRef:关联的Appender, 只有定义了logger并引入的appender,appender才会生效
           (3). additivity: logEvent的传递性。true LogEvent处理后传递给父Logger打印。false LogEvent处理后不再向上传递给父Logger(解决日志重复输出问题)
           (4). logger配置的level必须高于或等于Appenders中ThresholdFilter配置的过滤level, 否则会造成信息丢失
        2. root配置日志的根节点
        -->
        <!-- 按照模块划分日志 -->
        <logger name="com.boot.skywalk" level="info" additivity="false">
            <AppenderRef ref="Service"/>
        </logger>
        <root level="info">
            <AppenderRef ref="Console"/>
        </root>
    </Loggers>
</Configuration>

控制台日志打印

日志文件格式:

日志压缩格式:

后续使用重定向以及其他的加固项再整理吧,开启SSL、监听多个客户端端口整体设计了解了。 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐