SpringBoot系列之日誌框架介紹及其原理簡介html
市面上經常使用日誌框架:JUL、JCL、jboss-logging、logback、log4j、log4j二、slf4j、etc.java
其中日誌門面,也是一系列接口api的有slf4j(Simple Logging Facade for Java)、JCL(Jakarta Commons Logging)、jboss-logginspring
注意:經常使用的slf4j等只是一日誌門面,是一個日誌的抽象層,非日誌實現,具體的實現用經過log4j或者logback等框架去實現api
日誌調用的,仍是建議引入slf4j對應的jar和其實現框架log4j或者logback,而後調用的仍是以下進行調用,配好日誌實現框架的配置,就能夠進行日誌跟蹤springboot
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
slf官方手冊:slf4j官方手冊連接框架
如圖來自slf4j官方的圖,圖例已經很好的介紹了slf4j的使用場景:maven
etc.
spring-boot
ok,學到這裏應該有個疑問?在Spring項目中,好比Spring framework框架,Hibernate etc.,這些框架是否有本身的日誌實現,很顯示,基本每一個框架都有本身的日誌實現,好比,spring framework就是使用commons-logging進行日誌打印的,而Hibernate是經過(jboss-logging)的,etc.,因此這麼一堆日誌框架堆在一個項目中,是否能夠實現統一的日誌打印?好比統一到實現slf4j門面學習
在slf4j官網:http://www.slf4j.org/legacy.html,這個頁面已經提供了比較合理的兼容統一實現
如官網的圖例所示,主要提供引入一些橋接的jar,好比JCL框架能夠引入jcl-over-slf4j.jar
log4j能夠引入log4j-over-slf4j.net
官方說法:
爲了簡化從JCL到SLF4J的遷移,SLF4J發行版包括jar文件jcl-over-slf4j.jar。該jar文件旨在替代JCL
注意問題:
jcl-slf4j.jar,這個jar須要注意了,使用過程不要和jcl-over-slf4j一塊兒用
jcl-over-slf4j.jar不該與slf4j-jcl.jar混淆
JCL-over-SLF4J(即jcl-over-slf4j.jar)在出於向後兼容性緣由而須要支持JCL的狀況下很是有用。它能夠用於解決與JCL相關的問題,而沒必要採用SLF4J API,該決定能夠推遲到之後。
另外一方面,在爲組件採用SLF4J API 以後,slf4j-jcl.jar頗有用 ,該組件須要嵌入在正式要求JCL的更大的應用程序環境中。您的軟件組件仍可使用SLF4J API,而不會破壞大型應用程序。實際上,slf4j-jcl.jar會將全部日誌記錄決策委派給JCL,以便您的組件對SLF4J API的依賴關係對於更大的總體而言是透明的。
請注意,不能同時部署jcl-over-slf4j.jar和 slf4j-jcl.jar。前一個jar文件將使JCL將日誌記錄系統的選擇委派給SLF4J,後一個jar文件將使SLF4J將日誌記錄系統的選擇委派給JCL,從而致使無限循環。
ok,對於log4j-over-slf4j.jar使用過程一樣注意
log4j-over-slf4j.jar和slf4j-log4j12.jar不能同時存在
slf4j-log4j12.jar的存在(即SLF4J的log4j綁定)將強制將全部SLF4J調用委派給log4j。log4j-over-slf4j.jar的存在將把全部log4j API調用委派給它們的SLF4J等效項。若是二者同時存在,則slf4j調用將委派給log4j,而log4j調用將重定向到SLF4j,從而致使無限循環。
對於這些居然的jar是如何實現偷樑換柱的?咱們能夠點開對應的jar,如圖所示:這個jar的包名命名都和jcl的同樣,目的是實現偷樑換柱,強制不使用jcl的api,而實現slf4j
ok,能夠概括統一項目使用slf4j的過程,首先系統仍是用排除其它日誌實現jar,而後引入橋接的jar,等覆蓋了以後,就能夠加上對應的實現jar包,實現日誌打印
ok,有了前面的知識後,咱們能夠繼續學習Springboot的日誌實現了,從前面的知識能夠知道,slf4j只是一個日誌門面工程,並不是實現,在不少項目裏都有日誌框架混用的狀況,針對此種起來,能夠加入一些橋接的偷樑換柱jar,而後再加上對應的實現jar就能夠
而後Springboot其實也是相似這種實現,首先,Springboot默認使用slf4j做爲門面工程,在實現過程也是有用這些偷樑換柱的橋接jar進行slf4j統一,而後再引用logback做爲日誌實現的jar,先快速建立一個Springboot項目:Springboot系列之快速建立項目教程
建立好項目以後,是默認會引入日誌框架的,首先在pom文件,右鍵->maven->show dependencies顯示jar依賴圖
如圖所示,Springboot的場景啓動項目spring-boot-strater集成了spring-boot-strater-logging,spring-boot-strater-logging都是以logback爲默認的日誌實現框架,固然本博客是以Springboot2.2.1.RELEASE版本爲例子的
固然每一個版本的實現略有不一樣,不過基本都一致,給出尚硅谷老師給的圖片:
ok,Springboot項目已經對日誌作了一個比較好的兼容,還有一個日誌jar衝突問題須要注意,由於Springboot項目是統一爲slf4j門面的,很顯然Springboot在項目實現中就已經作了其它日誌jar門面的排除,好比spring項目就已經將jcljar排除了,如圖:
因此,在項目使用中,引入其它的jar,都要考慮是否有對應的日誌實現jar,要作必要的排除,以避免形成jar衝突
ok,這篇博客是對經常使用日誌框架的介紹,有了這些必要的知識以後,就能夠實踐一下了,詳情的能夠參數個人博客,SpringBoot系列日誌框架使用教程