您现在的位置是:首页 >技术交流 >SpringBoot日志配置(四十七)网站首页技术交流

SpringBoot日志配置(四十七)

两个蝴蝶飞 2024-06-17 10:47:00
简介SpringBoot日志配置(四十七)

当一切被遗忘,那么就回到最初的地方

上一章简单介绍了SpringBoot配置文件敏感信息加密(四十六) , 如果没有看过,请观看上一章

这一章节,我们学习一下日志配置.

参考文章: Spring Boot 日志配置(超详细)

一. 日志配置处理

我们创建一个普通的 SpringBoot 项目,依赖如下

一.一 pom.xml 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>top.yueshushu.log</groupId>
    <artifactId>SpringBoot_Log</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>SpringBoot_Log</name>
    <description>两个蝴蝶飞学习Log配置</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <build>
        <!--将该目录下的文件全部打包成类的路径-->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

一.二 编写一个测试方法

@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class LogTest {

    @Test
    public void logTest() {
        log.info("两个蝴蝶飞学习日志配置");
    }
}

查看日志输出:

image-20230518172349246

以我们自定义的日志内容为例:

2023-05-18 17:23:01.433  INFO 12756 --- [           main] top.yueshushu.log.LogTest                : 两个蝴蝶飞学习日志配置

打印的具体内容格式是:

日期时间精通到毫秒----日志级别(INFO)—进程id(12756)---- 分隔符 — 线程名(main, 用方括号括起来)----Logger名 (源代码的类名) ---- 日志具体内容

一.三 自定义配置日志打印信息

我们可以进行自定义日志打印信息, 在 application.yml 配置文件里面进行配置

#日志级别
logging:
  # 日志级别
  level:
    # 默认配置
    root: info
    # 对某个包进行配置
    top.yueshushu: debug
  file:
    # 日志输出位置
    path: /usr/yjl/log
  pattern:
    # 控制台打印格式
    console: '%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} - %msg%n'
    # 文件打印格式
    file: '%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === - %msg%n'

image-20230518184626757

文件中查询日志打印信息

image-20230518184652359

image-20230518184712607

一.四 日志常见信息

一.四.一 常见的日志级别

序号日志级别说明
1trace追踪,指明程序运行轨迹。
2debug调试,实际应用中一般将其作为最低级别,而 trace 则很少使用。
3info输出重要的信息,使用较多。
4warn警告,使用较多。
5error错误信息,使用较多。

一.四.二 常见的日志输出格式

序号输出格式说明
1%d{yyyy-MM-dd HH:mm:ss, SSS}日志生产时间,输出到毫秒的时间
2%-5level输出日志级别,-5 表示左对齐并且固定输出 5 个字符,如果不足在右边补 0
3%logger 或 %clogger 的名称
4%thread 或 %t输出当前线程名称
5%p日志输出格式
6%message 或 %msg 或 %m日志内容,即 logger.info(“message”)
7%n换行符
8%class 或 %C输出 Java 类名
9%file 或 %F输出文件名
10%L输出错误行号
11%method 或 %M输出方法名
12%l输出语句所在的行数, 包括类名、方法名、文件名、行数
13hostName本地机器名
14hostAddress本地 ip 地址

二. logback 配置文件配置 日志

在 resources 目录 下 创建 logback-spring.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="D:\usr\yjl\log" />
    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <!-- 过滤基础组件打印 -->
    <logger name="top.yueshsuhu.log" level="WARN"/>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

默认有五部分配置内容信息

我们从上到下, 对这些数据进行一下主要的讲解和配置.

二.一 根节点 configuration

<configuration  scan="true" scanPeriod="10 seconds">
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false-->
<configuration  scan="true" scanPeriod="10 seconds">
    ....
</configuration>    
属性信息
scan当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。
默认的时间间隔为1分钟。
debug当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

二.二 contextName 设置上下文名称

 <contextName>logback</contextName>

每个 logger 都关联到 logger 上下文, 默认的名称为 default. 可以使用设置成其他名字,用于区分不同应用程序的记录。

一旦设置,不能修改,可以通过%contextName来打印日志上下文名称,一般来说我们不用这个属性,可有可无。

建议,最好设置一下,设置成 logback 日志的类型

二.三 property 变量配置

 <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="D:\usr\yjl\log" />

用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。

通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量

这里通常会设置成 路径,格式, 彩色日志等信息

    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <!--配置日志存放路径-->
    <property name="log.path" value="D:\usr\yjl\log" />
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 控制台格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%X{traceId}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}[%line]){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!-- 输入到文件里面的日志格式 -->
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %logger{50}[%line] - %msg%n" />
    

会有颜色区分

image-20230518190842299

二.四 appender 格式化日志输出

appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略

通常是到控制台和文件中

二.四.一 控制台输出 ch.qos.logback.core.ConsoleAppender

指定级别和字符集, 很好理解.

<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>debug</level>
    </filter>
    <encoder>
        <!--控制台输出格式-->
        <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
        <!-- 设置字符集 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>

二.四.二 同步输出到文件 ch.qos.logback.core.rolling.RollingFileAppender

通过 rollingPolicy 设置滚动策略, 这样当日志过多时,会自动拆分成不同的文件.

    <!-- 时间滚动输出 level为 DEBUG 日志 -->
    <appender name="STOCK_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_stock.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/debug/log-stock-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>300MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <!-- 过滤器, 表示不处理这一个 -->
<!--        <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
    </appender>

会类似于这样的打印

image-20230518192011781

二.四.三 异步输出到文件 ch.qos.logback.classic.AsyncAppender

在实际开发中,我们最好也是进行异步输出, 这样不会进行阻塞线程

通过 关联到 普通的文件输出

  <!-- 异步输出 -->
    <appender name ="ASYNC_STOCK_FILE" class= "ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold >0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 异步日志提取调用者数据标识 true/false -->
        <includeCallerData>true</includeCallerData>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref ="STOCK_FILE"/>
    </appender>

二.四.四 warn 和 error 级别的文件输出

warn 和 error 一般会保存的周期长一些

    <!-- 时间滚动输出 level为 WARN 日志 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_warn.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!-- 过滤器, 表示不处理这一个 -->
        <!--        <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!-- 过滤器, 表示不处理这一个 -->
        <!--        <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
    </appender>

二.五 logger 具体指定某个包/类的日志打印级别

<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>

<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。

属性描述
name用来指定受此logger约束的某一个包或者具体的某一个类。
level用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity是否向上级logger传递打印信息。默认是true

有两种形式, 一种是 对包 进行指定级别, 另外一种是通过 appender 指定连接信息

二.五.一 对包指定

对特别重要的包, 可以降低级别信息

    <!-- 过滤基础组件打印 -->
     <logger name="top.yueshushu.log.message" level="WARN"/>
    <logger name="top.yueshushu.log.trade" level="INFO"/>

二.五.二 通过 appender-ref 指定 传递性

    <!--开发环境:打印控制台-->
    <logger name="top.yueshushu" level="DEBUG" additivity="false">
        <!--不向上传递, 指定 异步文件, 控制台, warn文件, error 文件-->
        <appender-ref ref="ASYNC_STOCK_FILE" />
       <appender-ref ref="CONSOLE"/>
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </logger>
    
    <!-- 不打印mapper的 debug 信息  MybatisPlus的 日志打印-->
    <logger name="com.yueshushu.log.mapper" level="INFO" additivity="false">
        <appender-ref ref="ASYNC_STOCK_FILE" />
         <appender-ref ref="CONSOLE"/>
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </logger>

additivity=“false” 表示不向上传递。

image-20230518194142414

二.六 root 默认配置

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。

level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会添加到这个loger。

root与logger是父子关系,没有特别定义则默认为root 。任何一个类只会和一个logger对应, 要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level

  <root level="INFO">
        <appender-ref ref="ASYNC_STOCK_FILE" />
         <appender-ref ref="CONSOLE"/>
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>

root 节点里面的内容,最好是配置一下

二.七 目前较完整的日志配置

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration  scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <!--配置日志存放路径-->
    <property name="log.path" value="D:\usr\yjl\log" />
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 控制台格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%X{traceId}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}[%line]){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!-- 输入到文件里面的日志格式 -->
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %logger{50}[%line] - %msg%n" />
    
    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <!--控制台输出格式-->
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 时间滚动输出 level为 DEBUG 日志 -->
    <appender name="STOCK_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_stock.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/debug/log-stock-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>300MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <!-- 过滤器, 表示不处理这一个 -->
<!--        <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
    </appender>

    <!-- 异步输出 -->
    <appender name ="ASYNC_STOCK_FILE" class= "ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold >0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 异步日志提取调用者数据标识 true/false -->
        <includeCallerData>true</includeCallerData>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref ="STOCK_FILE"/>
    </appender>

    <!-- 时间滚动输出 level为 WARN 日志 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_warn.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!-- 过滤器, 表示不处理这一个 -->
        <!--        <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!-- 过滤器, 表示不处理这一个 -->
        <!--        <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
    </appender>


    <!-- 过滤基础组件打印 -->
    <logger name="top.yueshushu.log.message" level="WARN"/>
    <logger name="top.yueshushu.log.trade" level="INFO"/>


    <!--开发环境:打印控制台-->
    <logger name="top.yueshushu" level="DEBUG" additivity="false">
        <!--不向上传递, 指定 异步文件, 控制台, warn文件, error 文件-->
        <appender-ref ref="ASYNC_STOCK_FILE" />
       <appender-ref ref="CONSOLE"/>
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </logger>

    <!-- 不打印mapper的 debug 信息  MybatisPlus的 日志打印-->
    <logger name="com.yueshushu.log.mapper" level="INFO" additivity="false">
        <appender-ref ref="ASYNC_STOCK_FILE" />
         <appender-ref ref="CONSOLE"/>
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </logger>

    <root level="INFO">
        <appender-ref ref="ASYNC_STOCK_FILE" />
         <appender-ref ref="CONSOLE"/>
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</configuration>

三. 其余额外配置信息

三.一 application.yml 配置文件信息

目前可以观察到, 日志的格式,文件路径,文件路径等,都是在 logback-spring.xml 文件中通过 property 属性进行配置的。

可以将其放置在application.yml 配置文件中,然后在logback-spring.xml 配置文件中进行引用配置

这个时候,就不能用 property 了,而需要用 springProperty 属性

三.一.一 application.yml 配置路径和 contextName变量

logback:
  contextName: yjl
  logPath: /usr/yjl/log

三.一.二 logback-spring.xml 引用变量

  <contextName>${contextName}</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <!--配置日志存放路径-->
<!--    <property name="log.path" value="D:\usr\yjl\log" />-->
    <springProperty name="log.path" scope="context" source="logback.logPath"/>
    <springProperty name="contextName" scope="context" source="logback.contextName"/>

image-20230518195339971

三.二 多环境配置

我们通常有 开发环境, 测试环境,和生产环境。 在开发环境中,我们希望 打印到 debug 级别到控制台, 便于排查问题。

在生产环境中,一般是到 info 级别,甚至是 warn 级别

可以通过 springProfile 节点进行配置

三.二.一 application.yml 指定环境

logback:
  contextName: yjl
  logPath: /usr/yjl/log
spring:
  profiles:
    active: dev

三.二.二 logback-spring.xml 多环境配置

    <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
    <springProfile name="dev,test">
        <logger name="top.yueshushu" level="DEBUG" additivity="false">
            <!--不向上传递, 指定 异步文件, 控制台, warn文件, error 文件-->
            <appender-ref ref="ASYNC_STOCK_FILE" />
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </logger>
    </springProfile>

    <!-- 生产环境 -->
    <springProfile name="prod">
        <logger name="top.yueshushu" level="DEBUG" additivity="false">
            <!-- 生产环境,不打印到控制台 -->
            <appender-ref ref="ASYNC_STOCK_FILE" />
<!--            <appender-ref ref="CONSOLE"/>-->
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </logger>
    </springProfile>

也可以这样配置

   <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
    <logger name="top.yueshushu" level="DEBUG" additivity="false">
        <!--不向上传递, 指定 异步文件, 控制台, warn文件, error 文件-->
        <springProfile name="dev,test">
            <appender-ref ref="CONSOLE"/>
        </springProfile>
        <appender-ref ref="ASYNC_STOCK_FILE" />
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </logger>

当配置文件为 dev 和 test 时,在控制台会打印输出。 为 prod 时,在控制台不会打印

建议使用第二种方式

本章节的代码放置在 github 上:


https://github.com/yuejianli/springboot/tree/develop/SpringBoot_Log


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。