SpringBoot日志配置(四十七)

news2024/11/18 22:26:34

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

上一章简单介绍了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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker-compose 实现Seata Server高可用部署 | Spring Cloud 51

一、前言 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事…

excel根据不同分类动态设置不同下拉列列表

有这样一个需求&#xff0c;有很多个系统&#xff0c;需要在excel中下拉选择其系统一级分类、二级分类、三级分类&#xff0c;不同的一级分类对应不同的二级分类列表&#xff0c;不同的二级分类对应不同的三级分类列表。 针对这个需求&#xff0c;我们采用了excel/wps中的数据…

数据结构总结7:并查集、图

后续会有补充 并查集 查你在哪个集合&#xff0c;在有一定交集情况下会合并集合 可应用的场景&#xff1a; 1.分组 2.已有集合合并 并查集就是把一组数据分组&#xff0c;把有共同特征的元素以树的形式放在一组 仔细观察数组中内融化&#xff0c;可以得出以下结论&#x…

【数据结构和算法】数据结构基础和算法思想

文章目录 1. 基础的一些数据结构&#xff08;1&#xff09;数组&#xff08;2&#xff09;链表&#xff08;3&#xff09;二叉树&#xff08;4&#xff09;哈希表 2. 有哪些常见的算法思想&#xff1f;3. 常见排序算法及其复杂度 1. 基础的一些数据结构 &#xff08;1&#xf…

java多线程之定时器

文章目录 一、 简介1. 概念2. 定时器的使用 二、 常用方法介绍1. Schedule(TimTask task,Data time&#xff09;2. Schedule(TimTask task,Data firstTime, long period&#xff09;3. Schedule(TimTask task, long delay&#xff09;4. Schedule(TimTask task, long delay, lo…

数据结构_排序

目录 1. 排序的基本概念 2. 插入排序 2.1 直接插入排序 2.2 折半插入排序 2.3 希尔排序 2.4 相关练习 3. 交换排序 3.1 冒泡排序 3.2 快速排序 3.3 相关练习 4. 选择排序 4.1 简单选择序列 4.2 堆排序 4.3 相关练习 5. 归并排序和基数排序 5.1 归并排序 5.2 基…

这几款实用的电脑软件推荐给你

软件一&#xff1a;TeamViewer TeamViewer是一款跨平台的远程控制软件&#xff0c;它可以帮助用户远程访问和控制其他计算机、服务器、移动设备等&#xff0c;并且支持文件传输、会议功能等。 TeamViewer的主要功能包括&#xff1a; 远程控制&#xff1a;支持远程访问和控制…

【Jenkins】Jenkins运行python脚本的简单操作(windows)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

Vue基础入门(中)

组件的定义 组件具备复用性 注意&#xff1a;全局组件&#xff0c;只要定义了&#xff0c;处处可以使用&#xff0c;性能不高&#xff0c;但是使用起来简单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…

Linux下的用户分类与su/sudo 命令,Linux下的文件类型/用户文件权限身份/文件权限属性/权限与文件权限/ls-l文件属性详解

Tips 下载就是把我们的文件拷贝到系统的某个特定路径之下&#xff0c;普通用户是不允许你往系统里面去拷的。 Linux下的用户分类 root用户&#xff0c;管理员级别的用户身份&#xff0c;他的话基本上不受权限的约束。普通用户&#xff0c;普通用户的添加与每个普通用户密码的…

《面试1v1》JavaNIO

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你好&#xff0c;我想问一下你对 Java NIO 的了解。 候选人&#xff1a; 当然&#xff0c;Java NIO 是 Java 的一种 I/O 模型&#xff0c;它提…

MapReduce【自定义分区Partitioner】

实际开发中我们可能根据需求需要将MapReduce的运行结果生成多个不同的文件&#xff0c;比如上一个案例【MapReduce计算广州2022年每月最高温度】&#xff0c;我们需要将前半年和后半年的数据分开写到两个文件中。 默认分区 默认MapReduce只能写出一个文件&#xff1a; 因为我…

「OceanBase 4.1 体验」OceanBase:解读领先的分布式数据库系统,功能与体验全解析

文章目录 前言一、关于 【OceanBase 4.1】征文活动&#xff08;可跳过&#xff09;二、OceanBase 产品了解2.1 初识 OceanBase2.2 什么是 OceanBase2.3 OceanBase 相关链接2.4 OceanBase 与传统数据库对比有何特别之处2.5 OceanBase 相关概念以及术语2.5.1 OceanBase 基本概念2…

接口测试总结及其用例设计方法整理,希望可以帮到你

目录 接口测试的总结文档 第一部分&#xff1a; 第二部分&#xff1a; 接口测试用例设计 接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做…

ios中video标签兼容问题

案例 这是在实际开发中遇到的问题,产品给出的效果图如下: 其实就是一个h5页面中有很多视频, 但是我为什么都画着预览图呢? 因为在ios中video标签中尽管有src属性, 但是在没有预览图的情况下, 是一个灰蒙蒙的图层的, 很丑, 效果如下: 看到这里是不是很崩溃, 在PC端, 在安卓端…

RK3568平台开发系列讲解(Camera篇)快速了解RK Camera的使用

🚀返回专栏总目录 文章目录 一、MIPI CSI1.1 Full Mode特点1.2 Split Mode特点二、Full Mode配置2.1 配置sensor端2.2 csi2_dphy0相关配置2.3 isp相关配置三、Split Mode配置3.1 配置sensor端3.2 csi2_dphy1/csi2_dphy2相关配置3.3 isp相关配置四、软件相关目录

自然语言处理实战项目7-利用层次聚类方法做文本的排重,从大量的文本中找出相似文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目7-利用层次聚类方法做文本的排重&#xff0c;从大量的文本中找出相似文本。随着互联网技术的不断发展&#xff0c;越来越多的数据被广泛地应用在各个领域中。而文本数据是其中之一&#xff0c;…

ar在汽车维修行业的应用场景

由于AR增强现实技术的易用性&#xff0c;在汽车产业链中&#xff0c;已处处可见AR技术的踪影&#xff0c;像汽车设计AR远程协同&#xff0c;汽车装配AR远程指导&#xff0c;汽车维修AR远程协助等等&#xff0c;那么下面为详细介绍AR增强现实技术在汽车制造领域的应用。 环境/物…

实力在线 | 赛宁网安连续三年入选《中国网络安全市场全景图》

​​近日&#xff0c;国内专业安全机构数说安全正式发布了《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;。此次全景图分类架构涵盖了产品、解决方案、应用场景、服务4个维度&#xff0c;覆盖了目前我国网络安全行业所有成熟的细分市场。 赛宁网安凭…

Postman实现数字签名,Session依赖, 接口依赖, 异步接口结果轮询

Script(JS)为Postman赋予无限可能 基于Postman 6.1.4 Mac Native版 演示结合user_api_demo实现 PS 最近接到任务, 要把几种基本下单接口调试和持续集成一下, 做个常规功能验证, 研究了下发现, 不同的下单途径, 有的需要登录(Session依赖), 有的需要验签(使用数字签名的微服务),…