Logback Logback 是log4j 框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J,它被设计用来替代 log4j
。Logback 提供了更高的性能,更丰富的日志功能和更好的配置选项。
在 Spring Boot 中,Logback 是默认的日志实现,至于官方为何用它作为默认日志组件,有以下几个原因:
-
- 性能:Logback 在性能上超越了许多其他的日志实现,尤其是在高并发环境下。
-
- 灵活性:Logback 提供了高度灵活的日志配置方式,支持从 XML、Groovy 以及编程式的方式进行配置。
-
- 功能丰富:除了基本的日志功能,Logback 还提供了如日志归档、日志级别动态修改、事件监听等高级功能。
-
- 与 SLF4J 集成:SLF4J 是一个日志门面(facade),使得应用程序可以在运行时更换日志实现。Logback 作为 SLF4J 的一个原生实现,可以无缝地与其集成。
-
- 与 Spring Boot 的自动配置集成:Spring Boot 提供了对 Logback 的自动配置,这意味着开发者无需手动配置 Logback,只需提供一个简单的配置文件即可。
引入依赖
由于 Spring Boot 默认使用 Logback,所以当你在 pom.xml
中加入 spring-boot-starter-web
依赖时,它会自动包含 Logback 相关依赖,无需额外添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
自定义 Logback 配置
为了满足特定的日志需求,我们通常会自定义 Logback 配置。
并且可以导入并使用SpringBoot为我们预设好的日志格式,在org/springframework/boot/logging/logback/defaults.xml
中已经帮我们把日志的输出格式定义好了,我们只需要设置对应的appender
。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 导入其他配置文件,作为预设 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- Appender作为日志打印器配置,这里命名随意 -->
<!-- ch.qos.logback.core.ConsoleAppender是专用于控制台的Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>
</appender>
<!-- 指定日志输出级别,以及启用的Appender,这里就使用了我们上面的ConsoleAppender -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
以及开启文件打印:
<!-- ch.qos.logback.core.rolling.RollingFileAppender用于文件日志记录,它支持滚动 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${FILE_LOG_CHARSET}</charset>
</encoder>
<!-- 自定义滚动策略,防止日志文件无限变大,也就是日志文件写到什么时候为止,重新创建一个新的日志文件开始写 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件保存位置以及文件命名规则,这里用到了%d{yyyy-MM-dd}表示当前日期,%i表示这一天的第N个日志 -->
<FileNamePattern>log/%d{yyyy-MM-dd}-spring-%i.log</FileNamePattern>
<!-- 到期自动清理日志文件 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- 最大日志保留时间 -->
<maxHistory>7</maxHistory>
<!-- 最大单个日志文件大小 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
</appender>
<!-- 指定日志输出级别,以及启用的Appender,这里就使用了我们上面的ConsoleAppender -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
自定义日志格式
我们也可以魔改官方提供的日志格式,官方文档:https://logback.qos.ch/manual/layouts.html
这里需要提及的是MDC机制,Logback内置的日志字段还是比较少,如果我们需要打印有关业务的更多的内容,包括自定义的一些数据,需要借助logback MDC机制。
比如我们现在需要记录是哪个用户访问我们网站的日志,只要是此用户访问我们网站,都会在日志中携带该用户的ID,我们希望每条日志中都携带这样一段信息文本,而官方提供的字段无法实现此功能,这时就需要使用MDC机制:
@ResponseBody
@GetMapping("/test")
public User test(HttpServletRequest request){
MDC.put("reqId", request.getSession().getId());
log.info("用户访问了一次测试数据");
return mapper.findUserById(1);
}
通过这种方式,我们就可以向日志中传入自定义参数了,我们日志中添加这样一个占位符%X{键值}
,名字保持一致:
%clr([%X{reqId}]){faint}
这样当我们向MDC中添加信息后,只要是当前线程(本质是ThreadLocal实现)下输出的日志,都会自动替换占位符