大方无隅,大器晚成,大音希声,大象无形。
1 前言
日志记录是项目开发中的一个重要的组成部分,特别是在微服务架构中,日志对于项目的调试和业务的监控至关重要。springboot
提供了灵活且强大的日志配置选项,能够帮助开发者轻松管理和查看日志。本文将以 springboot 3.1.3
为例,并总结项目的日志配置实践和关键点。
2 日志框架
在实际开发中,通常使用 lombok
来记录日志,通过 @Slf4j
注解来实现日志的记录。Slf4j
就是一个标准的日志门面,就如同一个接口,可以把不同的日志系统进行抽象,提供了一个标准的日志使用方式。logback,log4j
就是具体的日志实现方式,在 springboot
中,logback
是默认的日志实现方式。如下图所示,其
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
中,日志的配置涉及文件的名称,以及路径,文件的字符集,日志级别和实践的格式。
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
的配置在 springboot
的 logging.logback
中,默认的配置在 defaults.xml
, 日志在控制台的输出参见 console-appender.xml
,文件的输出配置文件在 file-appender.xml
中。
通常在 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注入信息
使用的方式如下图所示:
6 总结
在本文中,主要介绍了在 springboot
中日志的配置实践,以及相关的注意事项和实践操作,在后续的项目开发中提供技术支持。