文章概述:在寻找 Spring Boot 默认的 logback 配置文件未果的情况下,自行寻找默认配置文件并记录过程,而后贴出找到的默认配置文件的代码。

前言

而 Spring Boot 在 IDEA 控制台输出的日志格式和颜色比较符合我的审美,所以想将 Spring Boot 默认的配置文件拿来,然后改改一些属性自用,但是翻阅了多篇博客,始终找不到 Spring Boot 的默认的日志配置文件 logback.xml,大都是自定义的配置文件。

Spring Boot 在我 IDEA 中有如下的日志截图:
Spring Boot默认启动日志截图

寻找默认配置文件过程

既然百度和 Google 都没法容易搜索到(国内的博(la)客(ji)市场),那么索性去 GitHub 上看看 Spring Boot 官方的代码吧。

地址如下:spring-boot。小技巧:页面上按下小数点 . 即可切换到类 VS Code 的页面,如图:
GitHub Spring Boot VS Code 样图
于是就能直接搜索文件,这里搜索 logback.xml,即可搜索到仓库里面所有的 logback.xml 文件。稍微筛选了一下文件,于是得到了其中一个 logback.xml 的如下的内容:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/base.xml"/>
</configuration>

可以看到,它这个 logback.xml 文件直接引用的是 org/springframework/boot/logging/logback/base.xml 路径下的这个 base.xml 文件,也就是在 org.springframework.boot.logging.logback 路径下包含了 logback 的 Spring Boot 的默认配置文件。

至此,配置文件的寻找之旅告结了。

正文 - 默认配置文件

默认配置文件的引用

正如上面所说,只要按照 Spring Boot 的要求建立 logback 的 xml 文件,如 logback.xml 然后在里面写上简简单单的几行,就能在控制台输出和没有配置一样的效果的日志,如下图:
使用引用默认配置文件

自定义日志文件夹位置

运行程序之后,可能有会发现,日志文件,如果是 Windows 那么会生成在用户目录下 \AppData\Local\Temp 中,并且名字为 spring.log。需要更改的话,只需要在配置文件中修改 property 内容,将路径改为自己想要的即可,我这边如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_FILE" value="logs/app.log"/>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
</configuration>

也就是加了一行配置内容,覆盖了默认的 LOG_FILE 属性。

*以上,就是使用默认配置文件的简单说明分享。同时兼顾到了日志文件路径的自定义。 *

小结

至此,使用 Spring Boot 默认配置文件并且自定义路径的就已经完成了。

但是 Spring Boot 这个配置文件还是有一些地方值得看看的。

进一步探索

base.xml

这个文件的内容如下

<?xml version="1.0" encoding="UTF-8"?>

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->

<included>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</included>

可以看到它还引用了另一个默认的配置文件:default.xml,还有两个 appender 的配置文件:console-appender.xmlfile-appender.xml

同时还定义了日志文件的路径,这边的变量名为:LOG_FILE,路径我也看不懂,但是大致能从内容中读出来是在 tmp 文件夹下的 spring.log 文件。

因此只要重写覆盖 LOG_FILE 属性就能自定义 log 文件的位置了,也就是上一个小节提到的。

default.xml

这个文件里面定义了代码格式、高亮、基础变量、日志等级等信息,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--
Default logback configuration provided for import
-->

<included>
	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

	<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
	<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
	<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
	<property name="FILE_LOG_CHARSET" value="${FILE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>

	<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
	<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
	<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
	<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
	<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
	<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
	<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
	<logger name="org.springframework.boot.actuate.endpoint.jmx" level="WARN"/>
</included>

里面没有特别可以说的,重要的也就变量 CONSOLE_LOG_PATTERN,它是控制台输出日志格式和高亮的 pattern 格式。而 FILE_LOG_PATTERN 则是输出到日志文件中的日志格式。

console-appender.xml

这个是控制台输出的 appender,如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--
Console appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			<charset>${CONSOLE_LOG_CHARSET}</charset>
		</encoder>
	</appender>
</included>

十分简单,就是将 default.xml 中的变量拿过来引用了,然后作为 appender 输出到控制台。

file-appender.xml

这个是输出到文件的 appender 的配置,如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--
File appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset>${FILE_LOG_CHARSET}</charset>
		</encoder>
		<file>${LOG_FILE}</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
			<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>
			<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory>
		</rollingPolicy>
	</appender>
</included>

可见,首先也是使用了格式 pattern 为 FILE_LOG_PATTERN,然后将文件输出到 LOG_FILE 变量中的路径下,上一节提到,修改覆盖 LOG_FILE 就能更换路径了。

然后是滚动策略 rollingPolicy,关系到日志文件的生成规则、保留策略。这边有定义变量名,但是没有在 xml 中定义值,好在里面给了默认的值,比如 <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize> 字面意思就是最大的文件大小,变量名为 LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE,冒号后面的 10MB 表示的是省缺值。

整合形成一份 xml

说了这么多了,那就将上述默认的 xml 整合成一份吧,不用 <include></include> 来各种引用了,结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志文件路径 --> 
    <property name="LOG_FILE" value="logs/app.log}"/>

    <!-- default.xml 文件内容 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
    <property name="FILE_LOG_PATTERN"
              value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_CHARSET" value="${FILE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>

    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
    <logger name="org.springframework.boot.actuate.endpoint.jmx" level="WARN"/>


    <!-- console-appender.xml 文件内容 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${CONSOLE_LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <!-- file-appender.xml 文件内容 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${FILE_LOG_CHARSET}</charset>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}
            </fileNamePattern>
            <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>
            <maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- base.xml 文件内容替换 include 后的内容 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

总结

至此,如何找 Spring Boot 的默认 logback 配置文件的方法已经写明,同时也分享了自定义相关配置项属性。写此篇就是为了不太爱折腾配置文件,但是又想修改部分内容,又不想和原始格式不一致而来。

同时,这种办法也适合于其他日志框架的类比寻找。然,logback 是个很优秀的框架,还能支持定制各种更多的配置,此篇不再做这方面的赘述,请移步他处,有更好的适合参考。

转载请在文章开头注明版权声明和本文链接!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐