SpringBoot的日志系統(tǒng)詳解

概述

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.namelogging.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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绷跑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乃摹,更是在濱河造成了極大的恐慌,老刑警劉巖抬闯,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顽聂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舅巷,警方通過查閱死者的電腦和手機(jī)面氓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門兵钮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沟堡,“玉大人,你說我怎么就攤上這事矢空『铰蓿” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵屁药,是天一觀的道長(zhǎng)粥血。 經(jīng)常有香客問我,道長(zhǎng)酿箭,這世上最難降的妖魔是什么复亏? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缭嫡,結(jié)果婚禮上缔御,老公的妹妹穿的比我還像新娘。我一直安慰自己妇蛀,他們只是感情好耕突,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著评架,像睡著了一般眷茁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纵诞,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天上祈,我揣著相機(jī)與錄音,去河邊找鬼浙芙。 笑死登刺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嗡呼。 我是一名探鬼主播纸俭,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晤锥!你這毒婦竟也來了掉蔬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤矾瘾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后箭启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壕翩,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年傅寡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放妈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片北救。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芜抒,靈堂內(nèi)的尸體忽然破棺而出珍策,到底是詐尸還是另有隱情,我是刑警寧澤宅倒,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布攘宙,位于F島的核電站,受9級(jí)特大地震影響拐迁,放射性物質(zhì)發(fā)生泄漏蹭劈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一线召、第九天 我趴在偏房一處隱蔽的房頂上張望铺韧。 院中可真熱鬧,春花似錦缓淹、人聲如沸哈打。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽前酿。三九已至,卻和暖如春鹏溯,著一層夾襖步出監(jiān)牢的瞬間罢维,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工丙挽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肺孵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓颜阐,卻偏偏與公主長(zhǎng)得像平窘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凳怨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容