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 帮我们做完了以下几件“累活”:

  1. 引入了关键的 defaults.xml
    • defaults.xml 里定义了我们上次提到过的彩色日志转换规则%clr)。
    • 定义了默认的控制台输出格式 ${CONSOLE_LOG_PATTERN}
    • 定义了默认的文件输出格式 ${FILE_LOG_PATTERN}
    • 读取了 Spring Boot 的配置(如 application.yml 中设定的 logging.pattern.console 等变量)。
  2. 默认配置好了控制台输出 (CONSOLE):你不需要自己写 <appender name="CONSOLE" ...> 了。
  3. 默认配置好了文件输出 (FILE):包括按天滚动、文件大小限制等。
  4. 默认配置好了根日志级别 (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 已经帮你定义好了名为 CONSOLEFILE 的 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 太“黑盒”了,我们想自己完全掌控 CONSOLEFILE 的格式和文件路径,但我们又想白嫖 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(比如叫 CONSOLEFILE)了,否则会导致日志被重复打印或者启动时抛出 Logback 的重名警告。

posted @ 2026-07-23 17:03  dirgo  阅读(1)  评论(0)    收藏  举报