文章概述:在寻找 Spring Boot 默认的 logback 配置文件未果的情况下,自行寻找默认配置文件并记录过程,而后贴出找到的默认配置文件的代码。
文章目录
前言
而 Spring Boot 在 IDEA 控制台输出的日志格式和颜色比较符合我的审美,所以想将 Spring Boot 默认的配置文件拿来,然后改改一些属性自用,但是翻阅了多篇博客,始终找不到 Spring Boot 的默认的日志配置文件 logback.xml,大都是自定义的配置文件。
Spring Boot 在我 IDEA 中有如下的日志截图:
寻找默认配置文件过程
既然百度和 Google 都没法容易搜索到(国内的博(la)客(ji)市场),那么索性去 GitHub 上看看 Spring Boot 官方的代码吧。
地址如下: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.xml
和 file-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 是个很优秀的框架,还能支持定制各种更多的配置,此篇不再做这方面的赘述,请移步他处,有更好的适合参考。
转载请在文章开头注明版权声明和本文链接!