springboot 日志配置实践

347 阅读4分钟

大方无隅,大器晚成,大音希声,大象无形。

1 前言

日志记录是项目开发中的一个重要的组成部分,特别是在微服务架构中,日志对于项目的调试和业务的监控至关重要。springboot 提供了灵活且强大的日志配置选项,能够帮助开发者轻松管理和查看日志。本文将以 springboot 3.1.3 为例,并总结项目的日志配置实践和关键点。

2 日志框架

在实际开发中,通常使用 lombok 来记录日志,通过 @Slf4j 注解来实现日志的记录。Slf4j 就是一个标准的日志门面,就如同一个接口,可以把不同的日志系统进行抽象,提供了一个标准的日志使用方式。logback,log4j 就是具体的日志实现方式,在 springboot 中,logback 是默认的日志实现方式。如下图所示,其

1723300531010.png

3 日志配置

springboot 中,对于日志的配置如下图所示:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

在配置文件 application.yml 中,日志的配置涉及文件的名称,以及路径,文件的字符集,日志级别和实践的格式。

1723304628219.png

1 在 springboot3.1.3 中,日志的时间格式为 yyyy-MM-dd'T'HH:mm:ss.SSSXXX,可以通过 dateformat 设置时间的格式。
2 在日志中可以设置文件的字符集 file.encoding 为 utf-8.
3 在配置中可以设置文件的名称以及路径,name 即日志文件的名称,path 是文件的所在的路径,设置 path 后 name 则不不生效。
4 日志级别设置为 level 配置项, 其格式为 map 格式,可以配置每个命名空间的日志级别。
5 通过 config 可以配置日志的文件,通常使用的是 logback 格式,所以这里是 logback-spring.xml 的文件。
6 logging.file.max-size 限制日志文件大小,logging.file.max-history 限制日志保留天数,默认文件大小为 10MB, 日志存留天数为7天。

4 logback 配置项

默认情况下,logback 的配置在 springbootlogging.logback 中,默认的配置在 defaults.xml, 日志在控制台的输出参见 console-appender.xml ,文件的输出配置文件在 file-appender.xml 中。

1723363552578.png

通常在 logback-spring.xml 中,常用的配置包括日志的格式配置,控制态彩色输出,以及日志的存储方式。具体如下所示:

<?xml version="1.0" encoding="UTF-8"?>
 <!-- scan 为true 时,可以重新加载配置文件,scanPeriod 为扫描周期,默认时间单位为毫秒 -->
<configuration scan="true" scanPeriod="60000">
    <!-- 引用Spring Boot 默认日志配置 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
     <!-- 这里需要设置日志的上下文配置信息,这里可以从配置文件中读取,这里添加了项目的名称,项目端口号在日志中的输出。 -->
    <springProperty scope="context" name="spring_application_name" source="spring.application.name" defaultValue="app" />
    <springProperty scope="context" name="LOGGED_APPLICATION_NAME" source="spring.application.name" defaultValue="app" />
    <springProperty scope="context" name="app_port" source="server.port" defaultValue="-1" />
    <!-- 这里可以配置日志的转换信息,通过改写日志字符串,可以实现信息的脱敏 -->
    <conversionRule conversionWord="m" converterClass="com.platform.bootlog.sensitive.LogMessageConverter" />

    <!-- 控制台日志打印格式 
     %clr 即打印日志时,需要在控制台颜色输出 {faint} 即字符串间隔
     springboot 日志打印的颜色信息 blue、cyan、faint、green、magenta、red、yellow,通常使用 {faint} 来表示
     spring_application_name 即项目的名称 
     LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS 时间的格式,默认方式 :- 没有该项配置时,读取默认配置
    ${LOG_LEVEL_PATTERN:-%5p} 即打印日志的级别信息 TRACE < DEBUG < INFO < WARN < ERROR
    ${PID:- } 即进程号信息
    %15.15t 即线程号信息, t 代表线程号,15.15 的意思是超过 15个字符只输出前15个,否则按照实际内容输出
    %-40.40logger :通常使用源代码的类名
    %m 即日志内容信息 
    %wEx 即异常信息堆栈
    -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${spring_application_name} %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(${LOGGED_APPLICATION_NAME:-}[%15.15t]){faint} |${app_port}| %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

    <!-- 日志输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${CONSOLE_LOG_THRESHOLD}</level>
        </filter>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${CONSOLE_LOG_CHARSET}</charset>
        </encoder>
    </appender>
    
     <!--每天生成一个日志文件,保存30天的日志文件 -->
    <appender name="DayFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/log.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!--日志存储格式,最大存储时间,项目启动是否清除旧日志,文件大小,日志存储上限 -->
            <fileNamePattern>logs/log.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
            <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
             <charset>UTF-8</charset>
        </encoder>
        <!-- 还有异步输出文件的方式 -->

    <!-- 指定日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

5 MDC上下文

logback-spring.xml配置文件中添加自定义标识。将 [%X{trace_uuid}] 加入配置中。trace_uuid 这里需要在拦截器中设置该值,在请求时设置值,请求结束时需要清除该值。 MDC 常用的三个方法:

1   MDC.put(key,value) 注入值
2   MDC.remove(key) 移除指定的MDC注入信息
3   MDC.clear() 移除所有当前线程的MDC注入信息

使用的方式如下图所示:

1723370901393.png

6 总结

在本文中,主要介绍了在 springboot 中日志的配置实践,以及相关的注意事项和实践操作,在后续的项目开发中提供技术支持。