概述
boot通過LoggingSystem日志系統(tǒng)的抽象,為基于boot的應(yīng)用,在集成第三方日志框架時(shí),提供增強(qiáng)的功能.具體實(shí)現(xiàn)由LoggingApplicationListener
來完成,它負(fù)責(zé)感知ApplicationEnvironmentPreparedEvent
環(huán)境準(zhǔn)備完畢的事件,并對(duì)日志系統(tǒng)進(jìn)行初始化.感興趣的同學(xué)可以自行研究源碼.
另外,關(guān)于boot的日志特性的使用,更詳細(xì)的說明可以參考:https://docs.spring.io/spring-boot/docs/2.4.2/reference/htmlsingle/#boot-features-logging
在boot框架的支持下,以logback框架集成為例,我們可以選擇以下幾種集成配置方式:
- 原始logback.xml的配置集成方式肯定是支持的
- 如果應(yīng)用的日志使用場(chǎng)景簡(jiǎn)單,那么使用boot的默認(rèn)配置能力(無需logback.xml),通過application.yml中屬性的配置,來集成logback.這種方式boot可以提供一個(gè)ConsoleAppender和RollingFileAppender.
- 如果應(yīng)用的日志使用場(chǎng)景復(fù)雜,那么也可以使用boot對(duì)logback.xml配置方式的增強(qiáng)來集成,通過定義logback-spring.xml來實(shí)現(xiàn).boot額外提供了profile的能力(
<springProfile>
)和從屬性源提取屬性并裝配到日志上下文的能力(<springProperty>
)
默認(rèn)配置
如果要集成第三方日志框架,我們只需要引入第三方j(luò)ar的依賴即可,不需要做任何配置.boot默認(rèn)會(huì)幫我在rootLogger中追加ConsoleAppender,如果通過application.yml配置了logging.file.name
或logging.file.path
,boot還會(huì)額外追加一個(gè)RollingFileAppender,這樣可以將日志同時(shí)打印到控制臺(tái)和寫入文件.
此外,boot還定義了一系列定制屬性,讓我們可以對(duì)日志格式,滾動(dòng)策略等方面進(jìn)行進(jìn)一步的定制.
下面分別介紹
日志格式的定制
默認(rèn)情況下,日志格式分為控制臺(tái)格式和文件格式兩種
控制臺(tái)格式如下:
%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}
文件格式如下
%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}
可進(jìn)行定制的屬性如下:
屬性名 | 對(duì)應(yīng)的logback屬性名 | 描述 |
---|---|---|
logging.pattern.dateformat | LOG_DATEFORMAT_PATTERN | 默認(rèn)格式中,可以定義時(shí)間戳的格式,默認(rèn)值為yyyy-MM-dd HH:mm:ss.SSS |
logging.pattern.level | LOG_LEVEL_PATTERN | 默認(rèn)日志格式中,可以定義日志級(jí)別選項(xiàng)的模式,默認(rèn)值是%5p |
logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | 默認(rèn)格式中,Throwable轉(zhuǎn)String的格式,默認(rèn)值為%wEx |
當(dāng)然,除了修改局部格式之外,也可以對(duì)整體格式進(jìn)行重新配置
屬性名 | 對(duì)應(yīng)的logback屬性名 | 描述 |
---|---|---|
logging.pattern.console | CONSOLE_LOG_PATTERN | 定義ConsoleAppender日志的整體格式 |
logging.pattern.file | FILE_LOG_PATTERN | 定義RollingFileAppender日志的整體格式 |
關(guān)于RollingFileAppender,我們還可以進(jìn)行如下定制:
屬性名 | 對(duì)應(yīng)的logback屬性名 | 描述 |
---|---|---|
logging.file.name | LOG_FILE | RollingFileAppender寫入文件的完整路徑 |
logging.file.path | LOG_PATH | RollingFileAppender寫入文件的目錄,當(dāng)沒有配置LOG_FILE時(shí)該配置才生效,日志會(huì)寫入${LOG_PATH}/spring.log文件 |
還可以為RollingFileAppender中的滾動(dòng)策略(SizeAndTimeBasedRollingPolicy)進(jìn)行如下定制:
屬性名 | 對(duì)應(yīng)的logback屬性名 | 描述 |
---|---|---|
logging.file.clean-history-on-start | LOG_FILE_CLEAN_HISTORY_ON_START | 滾動(dòng)策略的配置,啟動(dòng)時(shí)是否清理歷史日志文件,默認(rèn)為false |
logging.file.max-history | LOG_FILE_MAX_HISTORY | 保留歷史文件的最大個(gè)數(shù),默認(rèn)為7 |
logging.file.max-size | LOG_FILE_MAX_SIZE | 日志文件的最大值,默認(rèn)10mb |
logging.file.total-size-cap | LOG_FILE_TOTAL_SIZE_CAP | 日志文件總占用空間限制,默認(rèn)無限制 |
logging.pattern.rolling-file-name | ROLLING_FILE_NAME_PATTERN | 歷史文件的命名模式,默認(rèn)值為${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz} |
增強(qiáng)配置文件logback-spring.xml
如果默認(rèn)配置無法滿足使用的話,可以使用增強(qiáng)配置文件的集成方式.
通過logging.config
屬性指定配置文件的讀取位置,默認(rèn)為classpath:/logback-spring.xml.
tips:如果boot成功讀取到了配置文件,則默認(rèn)配置方式就不再啟用了.
屬性名稱 | 描述 |
---|---|
logging.config | 用于指定配置文件的位置 |
之所以要給配置文件改名,是因?yàn)槿魏?code>LoggerFactory.getLogger()調(diào)用都會(huì)觸發(fā)日志logback框架的初始化,框架會(huì)自動(dòng)查找classpath下的logback.xml配置文件,而boot擴(kuò)展了配置文件的語法,這個(gè)擴(kuò)展是原生配置器不識(shí)別的,如果不改名的話,會(huì)導(dǎo)致解析異常.
增強(qiáng)的語法特性包括:
- 可以通過配置
<springProperty name="" source="">
將屬性值從spring環(huán)境對(duì)象的屬性源中提取出來,裝配到日志框架的上下文中,用于logback配置時(shí)屬性變量的替換 - 可以通過
<springProfile name=""></springProfile>
包裹特定配置,來讓配置在特定profile激活的情況下才生效.典型的場(chǎng)景是只有線下環(huán)境才激活ConsoleAppender的使用
另外,剛剛提到的默認(rèn)配置方式,boot也提供了等價(jià)的配置文件,在org/springframework/boot/logging/logback/
目錄下:
-
defaults.xml
:包含基本的Converter配置和特定logger的日志級(jí)別配置和默認(rèn)的日志格式 -
console-appender
: ConsoleAppender的等價(jià)配置 -
file-appender
:RollingFileAppender的等價(jià)配置 -
base.xml
:include了以上三個(gè)文件的配置,并且給rootLogger配置appender
我們也可以按照需要,將任意配置文件include到我們的logback-spring.xml文件中.
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
tips:如果不使用等價(jià)配置文件的話,也就不需要再配置默認(rèn)配置中的定制屬性了.
日志組和日志級(jí)別
無論是原生配置方式,默認(rèn)配置方式,還是增強(qiáng)配置方式,都支持使用application.yml來為logger配置日志級(jí)別.這樣就可以依靠boot的profile特性,不同環(huán)境設(shè)置不同的日志級(jí)別.
名稱 | 作用 | |
---|---|---|
logging.group.{groupNames} | 用于定義日志組,組合多個(gè)loggerName,, 分隔 |
|
logging.level.{loggerNames | groupNames} | 用于定義logger的日志級(jí)別,, 分隔 |
可以給指定的loggerName配置級(jí)別,也可以將多個(gè)loggerName組合成一個(gè)group,針對(duì)group進(jìn)行統(tǒng)一的日志級(jí)別配置.
boot默認(rèn)定義了兩個(gè)group:web和sql.
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