SpringBoot日志系統(tǒng)

日志系統(tǒng)
我們首先要區(qū)分一下,什么是日志門面(Facade)什么是日志實現(xiàn),我們之前學(xué)習(xí)的JUL實際上就是一種日志實現(xiàn),我們可以直接使用JUL為我們提供的日志框架來規(guī)范化打印日志,而日志門面,如SIf4j,是把不同的日志系統(tǒng)的實現(xiàn)進(jìn)行了具體的抽象化,只提供了統(tǒng)一的日志使用接口,使用時只需要按照其提供的接口方法進(jìn)行調(diào)用即可,由于它只是一個接口,并不是一個具體的可以直接單獨使用的日志框架,所以最終日志的格式、記錄級別、輸出方式等都要通過接口綁定的具體的日志系統(tǒng)來實現(xiàn),這些具體的日志系統(tǒng)就有l(wèi)og4j、 logback、java.uti.logging等,它們才實現(xiàn)了具體的日志系統(tǒng)的功能。
日志門面和日志實現(xiàn)就像JDBC和數(shù)據(jù)庫驅(qū)動一樣,一個是畫大餅的,一個是真的去做餅的。
日志門面:
slf4j
日志實現(xiàn):
Log4j
LogBack
Logging
下圖表示slf4j如何實現(xiàn)各種日志框架:
|
注意:
每一個日志實現(xiàn)框架都有自己的配置文件,使用slf4j以后,配置文件還是做成日志實現(xiàn)框架自己本身的配置文件。
比如實現(xiàn)框架選用logback,那么配置文件就寫logback.xml這種,實現(xiàn)框架選log4j,那么配置就選log4j.xml這種。
slf4j日志門面
Simple Logging Facadefor Java
slf4j是門面的抽象,具體實現(xiàn)可以交給log4j、logback或jdk的logging來實現(xiàn)。
說白了就是slf4j抽象接口支持各大日志框架的實現(xiàn)的支持。
結(jié)構(gòu)圖:類似jdbc的廠商
![]() |
我們用的是slf4j的門面接口,實現(xiàn)的是支持slf4j的實現(xiàn)框架(廠商)。
簡單的說,就是接口和接口實現(xiàn)類的關(guān)系!
Logback日志實現(xiàn)
要使用slf4j日志就要使用支持slf4j日志的實現(xiàn)。
logging日志框架是log4j的后繼者,相對使用較多,我們用這個來舉例子。
使用slf4j日志接口實現(xiàn)的是logging的框架實現(xiàn)類。
只要有實現(xiàn),slf4j就會自動去發(fā)現(xiàn)實現(xiàn)它。
然后logging實現(xiàn)就會自動尋找到resource資源路徑下的logback.xml配置文件。
需要的jar包:
slf4j-api
logback-core
logback-classic
引入依賴:
???
????<dependency>
??????<groupId>org.slf4jgroupId>
??????<artifactId>slf4j-apiartifactId>
??????<version>1.7.25version>
????dependency>
????
????<dependency>
??????<groupId>ch.qos.logbackgroupId>
??????<artifactId>logback-coreartifactId>
??????<version>1.2.3version>
????dependency>
????
????<dependency>
??????<groupId>ch.qos.logbackgroupId>
??????<artifactId>logback-classicartifactId>
??????<version>1.2.3version>
????dependency>如果是SpringBoot,則不用引入依賴,本身自帶了這些依賴。
logback.xml的配置文件

提示:
輸出的格式是可以自由設(shè)置
指定輸出的日志級別可以設(shè)置多個引用
輸出日志從高到底輸出
輸出日志的文件如果沒有會自動創(chuàng)建。
日志級別:
從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,?SpringBoot默認(rèn)只會打印 info 以上級別的信息。
測試:(測試slf4j門面接口實現(xiàn)類是logging實現(xiàn)類框架)

測試結(jié)果:


日志的輸出是按照日志的指定級別進(jìn)行輸出的,從小到大的級別輸出。
slf4j日志的填充功能:


注意:
當(dāng)slf4j在使用的時候沒有導(dǎo)入實現(xiàn)的包,會報找不到實現(xiàn)的錯。

奉上logback.xml的配置文件(方便復(fù)制)
??<configuration>
????
????<appender?name="STDOUT"?class="ch.qos.logback.core.ConsoleAppender">
????????<encoder>
????????????<pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS}?[%thread]?%-5level?%logger{35}?-?%msg?%npattern>
????????encoder>
????appender>
????
????<appender?name="FILE"?class="ch.qos.logback.core.FileAppender">
????????<file>/Users/hbm/Desktop/Java?API/ok2.txtfile>?
????????<encoder>
????????????<pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS}?[%thread]?%-5level?%logger{35}?-?%msg?%npattern>
????????encoder>
????appender>
????
????<root?level="trace">?
????????<appender-ref?ref="STDOUT"/>
????????<appender-ref?ref="FILE"/>
????root>
configuration>或者:
<configuration>
????
????<include?resource="org/springframework/boot/logging/logback/defaults.xml"/>
????
????<appender?name="CONSOLE"?class="ch.qos.logback.core.ConsoleAppender">
????????
????????<encoder>
????????????<pattern>${CONSOLE_LOG_PATTERN}pattern>
????????????<charset>UTF-8charset>
????????encoder>
????appender>
????
????<appender?name="FILE"?class="ch.qos.logback.core.FileAppender">
????????
????????<file>log/日志文件.logfile>
????????
????????<append>trueappend>
????????
????????<encoder>
????????????<pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS}?[%thread]?%-5level?%logger{35}?-?%msg?%npattern>
????????????<charset>UTF-8charset>
????????encoder>
????appender>
????
????
????<root?level="info">
????????
????????<appender-ref?ref="CONSOLE"/>
????????<appender-ref?ref="FILE"/>
????root>
configuration>輸出日志級別level可以自己選擇。
提示:
官方推薦logback的配置文件名為 logback-spring.xml 或 logback.xml 。
如果不進(jìn)行l(wèi)ogback-spring.xml的配置,則會自動使用springboot默認(rèn)提供的defaults.xml預(yù)設(shè)配置,即啟動時打印的信息樣式配置。如果配置了logback-spring.xml,則會覆蓋默認(rèn)預(yù)設(shè)配置。
通過上面的學(xué)習(xí),可以使用到控制臺輸出日志信息,一般建議以文件輸出日志信息,方便排查bug。
SpringBoot使用日志
SpringBoot為了統(tǒng)一日志框架的使用,,做了這些事情:
直接將其他依賴以前的日志框架剔除
導(dǎo)入對應(yīng)日志框架的SIi4j中間包
導(dǎo)入自己官方指定的日志實現(xiàn),并作為SIf4j的日志實現(xiàn)層
在SpringBoot中默認(rèn)使用的日志門面是Slf4j日志,默認(rèn)日志實現(xiàn)為LogBack。
SpringBoot中自帶了slf4j和logback的依賴,如需更換其他實現(xiàn),加入依賴即可。
使用默認(rèn)的slf4j+logback日志:
測試:
/**
?*?控制層
?*?@Author?黃柏茗
?*?@Date?2022-01-15
?*/
@Controller
public?class?MyController?{
????//日志
????Logger?logger?=?LoggerFactory.getLogger(MyController.class);
????@RequestMapping("/test")
????public?String?test()?{
????????logger.info("打印了個小日志");
????????return?"測試日志";
????}
}因為我們使用了Logbok,使用一個 @Slf4j 注解也可以搞定!
/**
?*?控制層
?*?@Author?黃柏茗
?*?@Date?2022-01-15
?*/
@Slf4j?//加入注解
@Controller
public?class?MyController?{
????
????@RequestMapping("/test")
????public?String?test()?{
????????//可直接使用日志,更方便
????????log.info("打印了個小日志");
????????return?"測試日志";
????}
}
兩者都可以,后者更簡潔方便,因為log對象本質(zhì)上在編譯時,lombok插件會自動給它加上Logger對象,使用的還是Logger對象。
所以,在SpringBoot中使用默認(rèn)的slf4j+logback日志實現(xiàn)就闊以了!
使用步驟請看上面的logback日志實現(xiàn)。
本次實驗使用的是SpringBoot+slf4j日志門面+logback日志實現(xiàn)。
總結(jié):
slf4j就是個接口,需要使用接口的實現(xiàn)類,實現(xiàn)類可以自由選擇,可以選擇log4j或者logback或jdk自帶的logging實現(xiàn)等.
推薦使用logback實現(xiàn),因為logback是log4j的后繼者。


