當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringBoot_日志-SpringBoot日志关系
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot_日志-SpringBoot日志关系
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
我們看到其他日志統(tǒng)一到slf4j的原理,我們看一下Springboot里的日志是怎么做的,首先這是springboot幫我們項目創(chuàng)建的配置文件,pom文件引入了web依賴,還引入了測試依賴,而這些依賴之間的關系,到底是怎么樣的呢,我們可以來分析一下,分析有兩種辦法,web依賴jackson,用來做ajax的,還依賴了tomcat,嵌入式的tomcat,他還依賴了數(shù)據(jù)校驗hibernate,還用了jboss-logging,但是還依賴了springboot-starter,spring-boot-starter是每一個啟動器都要依賴的東西,這是一個最基本的依賴,而我們的spring-boot-stater我們來看一下,里面有這么幾個模塊,一個是自動配置,我們以前老說的自動配置功能,在這個模塊里面,stater里面依賴了自動配置,依賴了yml文件解析,snakeyml解析的,還依賴了spring-boot-starter-logging,spring-boot里的日志是由他來做的,依賴了一個starter-logging,Springboot來用它來做日志功能,我們說每一個starter是一個場景啟動器,它是用來封裝我們?nèi)罩緢鼍暗?那我們這個日志是怎么用的呢,先來分析它的stater,我們這個日志記錄
在我們這個starter-logging里面,依賴了這么多,而logback就是我們?nèi)罩镜膶崿F(xiàn),logback-core,使用logback進行日志記錄,使用logback記錄日志,這是一個日志實現(xiàn),然后他還導了jul-to-log4j,log4j-over-slf4j,jcl-over-slf4j,這幾個是什么,這幾個就是把其他幾個日志框架,他的作用就是呢,把其他日志轉(zhuǎn)為slf4j的相關依賴,他就是將其他框架轉(zhuǎn)成slf4j的,由于logback都依賴slf4j,所以slf4j也導入進來,導入了日志抽象層slf4j,其實就和我們之前看slf4j官方文檔一樣,這是我們springboot在底層日志依賴關系,我們springboot底層依賴關系,那用一句話總結(jié),springboot底層也是用slf4j加logback的方式,進行日志記錄,第二個,他除了導入slf4j+logback以外,還導了jul-to-slf4j,log4j-over-slf4j,都是把什么東西變成slf4j,slf4j在后邊,把前邊的日志框架變成slf4j,這就是我們在解決遺留問題的時候,我們應用要用log4j+logback,可能有其他依賴,我們都把這個都替換成slf4j,因為springboot也考慮到了其他日志,Springboot也把其他日志替換成了slf4j,他導了中間的替換包,中間替換包是什么東西,我們來給大家隨便看一個,比如我們就以jcl-over-slf4j為例,雖然我們的jar包叫jcl-over-slf4j,但是里面的類名,叫org.apache.commons.logging,相當于commons-logging類都在里面,只不過這個類我們點進去看一下,我們在用的時候比如,日志工廠static LogFactory logFactory = new SLF4JLogFactory();我們new的是啥,是SLF4JLogFactory,也就是他在底層偷梁換柱了一下,雖然看起來是org.apache.commons.logging下的LogFactory,但是LogFactory在內(nèi)部使用的是SLF4JLogFactory,他們就是偷梁換柱包,這里舉一個例子放到里面就行了,剩下的一樣,都可以看到類似的邏輯,你都可以看到類似的邏輯,比如你看log4j-over-slf4j,log4j轉(zhuǎn)成slf4j,org.apache.log4j這個包名又是apache.log4j,但是真正用的時候,在Logger類里邊,要進行日志記錄,我們把這個點進去/*** Delegates to {@link org.slf4j.Logger#trace(String)} method in SLF4J.*/
public void trace(Object message) {differentiatedLog(null, LOGGER_FQCN, LocationAwareLogger.TRACE_INT, message, null);
}void differentiatedLog(Marker marker, String fqcn, int level, Object message, Throwable t) {String m = convertToString(message);if (locationAwareLogger != null) {locationAwareLogger.log(marker, fqcn, level, m, null, t);} else {switch (level) {case LocationAwareLogger.TRACE_INT:slf4jLogger.trace(marker, m);break;case LocationAwareLogger.DEBUG_INT:slf4jLogger.debug(marker, m);break;case LocationAwareLogger.INFO_INT:slf4jLogger.info(marker, m);break;case LocationAwareLogger.WARN_INT:slf4jLogger.warn(marker, m);break;case LocationAwareLogger.ERROR_INT:slf4jLogger.error(marker, m);break;}}
}他在日志記錄的時候,他來看日志的級別,里面用的是誰的日志記錄器,protected org.slf4j.Logger slf4jLogger;slf4j的日志記錄,在日志記錄的時候又是slf4j的,中間這些轉(zhuǎn)換包,偷梁換柱,按你原來的方式替掉了,包名都不變一下的,這是我們中間的轉(zhuǎn)換包
中間轉(zhuǎn)換包,他就長成這樣,中間包就是這個樣子,那Springboot就考慮了中間轉(zhuǎn)換的問題,所以唯一一個問題是什么,如果我們要引入其他的文件,我們在我們Springboot里面,我引入了其他框架,一定要把這個框架的默認日志依賴移除掉,假設框架里用的是log4j,類名包名一樣不就出現(xiàn)問題了嗎,我們這個jar包就沖突了,所以我們一定要移除掉,包括springboot也是這么做的,因為我們有一個疑問,spring框架用的是commons-logging,那spring排除了還是沒有排除commons-logging,我們可以簡單來看一下,我們來到這一塊,我們引入了spring-boot-logging-stater,我們以后也就應該這么來做,我們引入新框架以后,springboot能夠適配所有的日志,而且底層使用slf4j+logback記錄日志,我們唯一需要做的是,引入其他框架的時候,只需要把其他框架的日志框架,排除掉,我們不用再做任何多余的操作,直接springboot就能適配起來,這就是springboot做日志的核心總結(jié)
?
總結(jié)
以上是生活随笔為你收集整理的SpringBoot_日志-SpringBoot日志关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot_日志-其他日志框架
- 下一篇: SpringBoot_日志-Spring