logback-spring.xml 中<include resource="org/springframework/boot/logging/logback/base.xml"/>作用
[AI生成]
这一行代码的作用是:引入 Spring Boot 官方预定义的 Logback 基础配置文件。
在 logback-spring.xml 中,你可以把它理解为一个“宏”或者“包含文件”。当 Logback 启动并解析你的 logback-spring.xml 时,遇到这一行,它会自动去 classpath 中找到 org/springframework/boot/logging/logback/base.xml 这个文件,并把里面的全部内容原封不动地“粘贴(复制)”到当前的位置。
下面详细拆解这行代码背后的机制和它具体引入了什么内容:
1. 它的文件位置在哪里?
Spring Boot 的 jar 包内部自带了这个文件。你可以在 Spring Boot 的源码或依赖包中找到它。它的真实路径在 Spring Boot 内部如下:
spring-boot-x.x.x.jar -> org/springframework/boot/logging/logback/base.xml
2. 这个 base.xml 里面到底有什么内容?
打开 Spring Boot 的源码,你会发现 base.xml 的内容大致如下:
<configuration>
<!-- 再次引入默认的日志级别和转换规则 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定义控制台输出的 Appender,名字叫 CONSOLE -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>
</appender>
<!-- 定义一个不是立即生效的文件输出 Appender,名字叫 FILE -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${FILE_LOG_CHARSET}</charset>
</encoder>
<!-- 具体的文件滚动策略配置... -->
</appender>
<!-- 根日志记录器,级别为 INFO,同时输出到控制台和文件 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
从中可以看出,base.xml 帮我们做完了以下几件“累活”:
- 引入了关键的
defaults.xml:defaults.xml里定义了我们上次提到过的彩色日志转换规则(%clr)。- 定义了默认的控制台输出格式
${CONSOLE_LOG_PATTERN}。 - 定义了默认的文件输出格式
${FILE_LOG_PATTERN}。 - 读取了 Spring Boot 的配置(如
application.yml中设定的logging.pattern.console等变量)。
- 默认配置好了控制台输出 (
CONSOLE):你不需要自己写<appender name="CONSOLE" ...>了。 - 默认配置好了文件输出 (
FILE):包括按天滚动、文件大小限制等。 - 默认配置好了根日志级别 (
root level="INFO")。
3. 在你自己的 logback-spring.xml 中加上这行,意味着什么?
假设你的 logback-spring.xml 这样写:
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
</configuration>
效果等同于:你完全采用了 Spring Boot 默认的日志配置(控制台带颜色输出、同时生成一个滚动文件、默认 INFO 级别)。
实际上,如果你仅仅需要默认配置,你连 logback-spring.xml 都不用建。Spring Boot 默认就会加载这个 base.xml。
4. 为什么我们自己写了配置文件,还要引入它?
主要有两个常见场景:
场景 A:只是想在默认配置上做微调
引入 base.xml 后,Spring Boot 已经帮你定义好了名为 CONSOLE 和 FILE 的 appender。你只需要写一点点代码即可,比如你想把 com.example.demo 包的日志级别改成 DEBUG,你不需要重新写一大堆 <appender> 和 <pattern>,直接这样写即可:
<configuration>
<!-- 引入基础配置,生成了 CONSOLE 和 FILE 两个输出源,并设置了 root 为 INFO -->
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!-- 仅仅针对自己的包做特殊日志级别设置,且复用 base.xml 中的 CONSOLE -->
<logger name="com.example.demo" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
</configuration>
场景 B:只引入 defaults.xml 而不引入 base.xml
有时候我们觉得 base.xml 太“黑盒”了,我们想自己完全掌控 CONSOLE 和 FILE 的格式和文件路径,但我们又想白嫖 Spring Boot 提供的彩色格式 %clr 和那些环境变量。
这时候,我们通常不引入 base.xml,而是引入更底层的 defaults.xml:
<configuration>
<!-- 只引入默认变量、规则和颜色 %clr,不自动生成 appender 和 root -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 自己定义 pattern,使用 defaults.xml 里提供的 ${CONSOLE_LOG_PATTERN} 变量 -->
<appender name="MY_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="MY_CONSOLE"/>
</root>
</configuration>
总结
<include resource="org/springframework/boot/logging/logback/base.xml"/> 的意思就是:
“让我用 Spring Boot 开箱即用的全套标准日志配置,我不想去手写那些复杂的彩色控制台模板和文件滚动策略了,直接拿来主义。”
特别提醒:如果你引入了 base.xml,就不要在你的配置文件里再次定义同名的 appender(比如叫 CONSOLE 或 FILE)了,否则会导致日志被重复打印或者启动时抛出 Logback 的重名警告。

浙公网安备 33010602011771号