# SpringBoot3教程 - 10 日志配置
项目运行,日志记录是必不可少的,可以帮助我们跟踪和定位问题,监控系统运行情况,记录业务关键指标等。
下面就直接介绍一下 SpringBoot 中的日志配置。
Spring Boot 默认使用 SLF4J 作为日志门面,并结合 Logback 作为日志实现。
所以首先在 resources 目录下新建 logback-spring.xml
配置文件,并编辑内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义一个控制台的日志输出 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定义日志文件路径 -->
<property name="LOG_PATH" value="logs" />
<!-- 控制台输出,通常用于开发环境 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 定义一个文件日志输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件路径 -->
<file>${LOG_PATH}/doubibiji-server.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天产生一个新的日志文件 -->
<fileNamePattern>${LOG_PATH}/doubibiji-server.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留的历史日志文件数量 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 设置根日志记录器,如果没有激活任何特定Profile,则使用默认配置 -->
<root level="debug">
<appender-ref ref="CONSOLE"/>
</root>
<!-- 开发环境配置 -->
<springProfile name="dev">
<root level="debug">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</springProfile>
<!-- 测试环境配置 -->
<springProfile name="test">
<root level="info">
<appender-ref ref="FILE"/>
</root>
</springProfile>
<!-- 生产环境配置 -->
<springProfile name="prod">
<root level="info">
<appender-ref ref="FILE"/>
</root>
</springProfile>
<!-- 设置特定包的日志级别 -->
<logger name="com.doubibiji" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</logger>
</configuration>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
上面定义了 控制台 和 文件 的日志输出,并使用 springProfile
定义了不同环境的日志输出,这里的 name 的值是和项目的配置文件 application.yaml 中的 spring.profiles.active
的值对应的。还可以指定特定的包的日志级别。
logback的配置文件可以定义为 logback.xml
,但是上面使用了 springProfile
,这是属于 SpringBoot
的配置,所以文件名称必须定义为logback-spring.xml
。
# 1 Java日志体系
Java日志体系看上去非常混乱,log4j
、log4j2
、sl4j
、logback
、commons-logging
这些东西根本分不清之间的关系。
这个就说来话长了:
很久很久以前,根本就没有上面这些乱七八糟的框架,System.out.println
走天下,但是只打印在控制台不行啊,后面无法追溯啊,于是乎,有一个牛逼的哥们(名叫:Ceki Gülcü ),他编写了一个日志记录框架,叫 Log4j
,可以根据不同的等级(比如 DEBUG、INFO、WARN、ERROR)来分类日志,还可以指定日志输出的地方,比如控制台、文件等,还包括异步等强大功能,Log4j 推出后,迅速得到广泛使用和认可。哥们觉得这么好用的框架,大家一起用吧,于是 Ceki Gülcü 曾希望将 Log4j 集成到 JDK 中,成为 Java 官方日志记录的标准组件,但是 Java 官方没鸟他,并在 Java 1.4 版本中,Java 官方推出了 java.util.logging(简称 JUL),最终 Log4j 被 Apache 基金会收编了。
后来各种日志框架层出不穷,问题也来了,不同项目甚至同一个项目的不同模块都使用不同的日志框架,导致代码的兼容性变差,为了统一日志框架,日志门面(Logging Facades)应运而生。
首先出场的是门面 Jakarta Commons Logging
(简称JCL)最初是 Jakarta 项目的一部分,后来才成为 Apache Commons 的一部分。JCL 由 Craig R. McClanahan 创建 ,它不是具体的日志实现,只是门面,可以理解为接口,具体记录日志的功能,需要使用具体的日志实现框架,例如 Log4j、JUL 等。
之后,Ceki Gülcü 觉得JCL写的什么玩意,不好用,于是再次出手,推出了 SLF4J(Simple Logging Facade for Java,也是一个日志门面)。SLF4J 不仅提供了统一的日志接口,还支持绑定到各种不同的日志实现,如 Log4j、 JUL等。SLF4J 的出现极大地简化了日志框架的使用,
不久后,Ceki Gülcü 觉得 Log4j 虽然很好,但还有改进的空间。于是,他开发了一个新的日志框架 Logback。Logback 在性能和功能上都有很大的提升,是对 Log4j 的一次重要升级。由于 Logback 是由 Log4j 的作者开发的,它自然得到了很多开发者的认可和使用。
尽管 Logback 非常优秀,但 Log4j 并没有被遗忘。Log4j 的社区决定对 Log4j 进行一次重大升级,推出了 Log4j2,由 Apache Logging Project 团队开发。Log4j2 在性能、配置和功能上都做了大量的改进,成为了与 Logback 并驾齐驱的强大日志框架。
通过上面的描述,可以看出 Java 中日志框架是时候 门面模式
实现的,所以包含 门面
和 实现
两个部分。
常用的门面有:JCL、SLF4J、
常用的实现有:Log4j(不更新,已淘汰了)、JUL、Log4j2、Logback
目前用的最多的是 SLF4J,因为性能要比 JCL 好,许多主流框架都使用了 SLF4J,Spring Boot 默认使用 SLF4J 作为日志门面,并结合 Logback 作为日志实现。
在使用 SLF4J 的时候,在 SLF4J 和具体的日志实现之间,还需要指定的桥接器,所以使用要比 JCL 复杂一丢丢。
这里先不演示了。