SpringBoot中Logback日志配置解析本篇要點一、Logback日志框架介紹二、SpringBoot與Logback1、默認日志格式2、控制臺輸出3、文件輸出4、日志級別5、日志組6、自定義log配置三、logback-spring.xml自定義注意事項配置文件下載參考閱讀
SpringBoot中Logback日志配置解析
本篇要點
介紹什么是Logback
介紹SpringBoot中對logging默認的配置
介紹自定義logback-spring.xml的注意點
一、Logback日志框架介紹
SpringBoot使用 Commons Logging 進行所有內(nèi)部日志的記錄,但默認配置也提供了對常用日志的支持,如 Java Util Logging,Log4J2,和Logback. 每種logger都可以通過配置使用控制臺或文件輸出日志內(nèi)容。
Logback是log4j框架的作者開發(fā)的新一代日志框架,它效率更高、能夠適應諸多的運行環(huán)境,同時天然支持SLF4J。
二、SpringBoot與Logback
假設你使用starter啟動創(chuàng)建SpringBoot應用,則默認已經(jīng)導入了spring-boot-starter-logging的依賴,相繼也就導入了logback所需要的依賴。

1、默認日志格式
于是,當我們啟動SpringBoot應用時,控制臺將會顯示INFO級別的日志輸出。

可以看到,輸出內(nèi)容如下:
日期和時間,精確到毫秒級別。
日志級別:INFO,【日志級別默認從高到低:ERROR,WARN,INFO,DEBUG,TRACE】。
進程ID
分隔符:來標識實際日志消息的開始。
線程名:用方括號括起來(在控制臺輸出時可能被截斷)。
日志記錄器名稱:這通常是源類名稱(通??s寫)。
日志信息
logback是沒有FATAL級別的,它對應的就是ERROR。
2、控制臺輸出
默認的日志配置就是將日志信息顯示到控制臺,默認情況下,將會顯示INFO級別以上的日志信息。你還可以通過使用--debug標志啟動debug模式。
$ java -jar myapp.jar --debug
使用IDEA操作可以編輯Program arguments:--debug。
在application.properties中配置debug=true同樣也可以將日志級別調(diào)整到DEBUG。
3、文件輸出
默認情況下,SpringBoot的日志只會輸出到控制臺,如果你還想輸出到文件中,你需要配置logging.file.name和logging.file.path兩個屬性。
下面這個表格展示如何組合使用logging.*來達到理想的效果:
logging.file.name |
logging.file.path |
Example | Description |
|---|---|---|---|
| (none) | (none) | 只會輸出到控制臺 | |
| 指定文件 | (none) | my.log |
寫入指定的日志文件在當前項目目錄下 |
| (none) | 指定目錄 | log |
在當前項目下的log目錄,寫入spring.log文件 |
日志文件達到10 MB時會觸發(fā)滾動策略【切分】,默認情況下會記錄INFO以上級別的信息。 可以使用logging.file.max-size屬性更改大小限制。 除非已設置logging.file.max-history屬性,否則默認情況下將保留最近7天的輪轉(zhuǎn)日志文件。 可以使用logging.file.total-size-cap限制日志歸檔文件的總大小。 當日志歸檔的總大小超過該閾值時,將刪除備份。 要在應用程序啟動時強制清除日志存檔,請使用logging.file.clean-history-on-start屬性。
4、日志級別
可以使用logging.level設置所有受支持的日志記錄器的級別。
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
5、日志組
使用logging.group能夠?qū)⑾嚓P的logger組合在一起統(tǒng)一管理日志級別等配置。使用方法如下:
假設定義了group為tomcat:
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
一旦這樣定義之后,就可以僅僅通過一行配置,完成相關三個logger的級別配置:
logging.level.tomcat=TRACE
SpringBoot預定義了兩個開箱即用的日志組:
| Name | Loggers |
|---|---|
| web |
org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
|
| sql |
org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener
|
# pre-defined
logging.level.web=debug
logging.level.sql=debug
6、自定義log配置
由于日志服務一般都在ApplicationContext創(chuàng)建前就初始化了,它并不是必須通過Spring的配置文件控制。因此通過系統(tǒng)屬性和傳統(tǒng)的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
你可以根據(jù)你的日志系統(tǒng),按照下面表格的定義規(guī)則,選擇定義對應的日志配置:
| Logging System | Customization |
|---|---|
| Logback |
logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
|
| Log4j2 |
log4j2-spring.xml or log4j2.xml
|
| JDK (Java Util Logging) | logging.properties |
SpringBoot官方推薦使用帶有-spring的文件名作為配置,如logback-spring.xml而不是logback.xml。
這樣命名的好處在于:因為標準的logback.xml配置文件加載得太早,所以不能在其中使用擴展,需要使用logback-spring.xml。
當然上面是默認的命名規(guī)則,如果你想自定義xml的名稱,自定義路徑,可以通過logging.config屬性配置:
logging.config=classpath:logging-config.xml
三、logback-spring.xml自定義注意事項
接下來分享一份配置十分詳細的logback.xml配置,參照注釋,應該就能夠掌握xml的定義。
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低于WARN的信息都不會輸出 -->
<!-- scan:當此屬性設置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true -->
<!-- scanPeriod:設置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 -->
<!-- debug:當此屬性設置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。 -->
<contextName>logback</contextName>
<!-- name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量。 -->
<property name="log.path" value="log" />
<property name="console_log_pattern"
value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
<property name="charset" value="UTF-8"/>
<!--輸出到控制臺-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是為開發(fā)使用,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
<!-- 例如:如果此處配置了INFO級別,則后面其他位置即使配置了DEBUG級別的日志,也不會被輸出 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>${console_log_pattern}</pattern>
</encoder>
</appender>
<!--輸出到文件,只記錄INFO級別信息-->
<appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/roll_info/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${console_log_pattern}</pattern>
<charset>${charset}</charset>
</encoder>
<!-- 日志記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志歸檔路徑以及格式 -->
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天數(shù)-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 如果超過10MB就刪除 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<!-- 此日志文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到文件,只記錄WARN級別信息-->
<appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>
<!--輸出到文件,只記錄ERROR級別信息-->
<appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>
<!--
root節(jié)點是必選節(jié)點,用來指定最基礎的日志輸出級別,只有一個level屬性
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默認是DEBUG
可以包含零個或多個appender元素。
-->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="info_file" />
<appender-ref ref="warn_file"/>
<appender-ref ref="error_file"/>
</root>
<!--
<logger>用來設置某一個包或者具體的某一個類的日志打印級別、以及指定<appender>。
<logger>僅有一個name屬性,
一個可選的level和一個可選的additivity屬性。
name:用來指定受此logger約束的某一個包或者具體的某一個類。
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
如果未設置此屬性,那么當前l(fā)ogger將會繼承上級的級別。
additivity:是否向上級logger傳遞打印信息,默認是true
-->
<!-- 使用mybatis的時候,sql語句是debug下才會打印,而這里我們只配置了info,所以想要查看sql語句的話,有以下兩種操作:
第一種把<root level="INFO">改成<root level="DEBUG">這樣就會打印sql,不過這樣日志那邊會出現(xiàn)很多其他消息
第二種就是單獨給mapper下目錄配置DEBUG模式,代碼如下,這樣配置sql語句會打印,其他還是正常DEBUG級別:
-->
<logger name="com.hyh.logback.web.LogTestController" level="WARN" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="warn_file"/>
<appender-ref ref="error_file"/>
</logger>
<!-- 如果多環(huán)境開發(fā)可以用springProfile -->
<!--開發(fā)環(huán)境:打印控制臺-->
<springProfile name="dev">
<!--可以輸出項目中的debug日志,包括mybatis的sql日志-->
<logger name="com.hyh.logback.web" level="DEBUG">
<appender-ref ref="console"/>
</logger>
<!--
root節(jié)點是必選節(jié)點,用來指定最基礎的日志輸出級別,只有一個level屬性
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默認是DEBUG
可以包含零個或多個appender元素。
-->
<root level="INFO">
<appender-ref ref="console"/>
</root>
</springProfile>
</configuration>
最終的效果,會在項目路徑下生成日志文件:/log/info/log-info-2020-11-01.0.log,并且日志文件的策略也在xml中定義。
控制臺打印信息,如下圖所示:

配置文件下載
本文內(nèi)容均為對優(yōu)秀博客及官方文檔總結而得,原文地址均已在文中參考閱讀處標注。最后,文中的代碼及配置文件詳細樣例已經(jīng)全部上傳至Gitee:https://gitee.com/tqbx/springboot-samples-learn