SpringBoot系列之日志框架介紹及其原理簡介
1求类、常用日志框架簡介
市面上常用日志框架:JUL奔垦、JCL、jboss-logging尸疆、logback椿猎、log4j、log4j2寿弱、slf4j鸵贬、etc.
其中日志門面,也是一系列接口api的有slf4j(Simple Logging Facade for Java)脖捻、JCL(Jakarta Commons Logging)阔逼、jboss-loggin
注意:常用的slf4j等只是一日志門面,是一個日志的抽象層地沮,非日志實現(xiàn)嗜浮,具體的實現(xiàn)用通過log4j或者logback等框架去實現(xiàn)
2、在項目中使用slf4j
日志調(diào)用的摩疑,還是建議引入slf4j對應的jar和其實現(xiàn)框架log4j或者logback危融,然后調(diào)用的還是如下進行調(diào)用,配好日志實現(xiàn)框架的配置雷袋,就可以進行日志跟蹤
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官方的圖吉殃,圖例已經(jīng)很好的介紹了slf4j的使用場景:
- 如左一圖示,直接導slf4j API工程是不能實現(xiàn)日志打印的
- logback的使用楷怒,需要導入slf4j API工程和其實現(xiàn)logback-classic.jar蛋勺、logback-core.jar
- log4j的使用,同樣導入slf4j API工程鸠删,還要再加比較關(guān)鍵的適配層jar:slf4j-log412.jar抱完,然后log4j.jar才能適配slf4j
- JTL(java util logging)也是通過適配層的slf4j-jdk14.jar先進行適配,然后jtl框架才能正常實現(xiàn)slf4j的api
-
etc.
在這里插入圖片描述
3刃泡、系統(tǒng)日志統(tǒng)一到slf4j
ok巧娱,學到這里應該有個疑問?在Spring項目中烘贴,比如Spring framework框架禁添,Hibernate etc.,這些框架是否有自己的日志實現(xiàn)桨踪,很顯示老翘,基本每個框架都有自己的日志實現(xiàn),比如,spring framework就是使用commons-logging進行日志打印的酪捡,而Hibernate是通過(jboss-logging)的,etc.纳账,所以這么一堆日志框架堆在一個項目中逛薇,是否可以實現(xiàn)統(tǒng)一的日志打印疏虫?比如統(tǒng)一到實現(xiàn)slf4j門面
在slf4j官網(wǎng):http://www.slf4j.org/legacy.html永罚,這個頁面已經(jīng)提供了比較合理的兼容統(tǒng)一實現(xiàn)
如官網(wǎng)的圖例所示,主要提供引入一些橋接的jar卧秘,比如JCL框架可以引入jcl-over-slf4j.jar
log4j可以引入log4j-over-slf4j
官方說法:
為了簡化從JCL到SLF4J的遷移呢袱,SLF4J發(fā)行版包括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相關(guān)的問題蚯涮,而不必采用SLF4J API治专,該決定可以推遲到以后。
另一方面遭顶,在為組件采用SLF4J API 之后张峰,slf4j-jcl.jar很有用 ,該組件需要嵌入在正式要求JCL的更大的應用程序環(huán)境中棒旗。您的軟件組件仍可以使用SLF4J API喘批,而不會破壞大型應用程序。實際上铣揉,slf4j-jcl.jar會將所有日志記錄決策委派給JCL饶深,以便您的組件對SLF4J API的依賴關(guān)系對于更大的整體而言是透明的。
請注意逛拱,不能同時部署jcl-over-slf4j.jar和 slf4j-jcl.jar粥喜。前一個jar文件將使JCL將日志記錄系統(tǒng)的選擇委派給SLF4J,后一個jar文件將使SLF4J將日志記錄系統(tǒng)的選擇委派給JCL橘券,從而導致無限循環(huán)额湘。
ok,對于log4j-over-slf4j.jar使用過程同樣注意
log4j-over-slf4j.jar和slf4j-log4j12.jar不能同時存在
slf4j-log4j12.jar的存在(即SLF4J的log4j綁定)將強制將所有SLF4J調(diào)用委派給log4j旁舰。log4j-over-slf4j.jar的存在將把所有l(wèi)og4j API調(diào)用委派給它們的SLF4J等效項锋华。如果兩者同時存在,則slf4j調(diào)用將委派給log4j箭窜,而log4j調(diào)用將重定向到SLF4j毯焕,從而導致無限循環(huán)。
對于這些竟然的jar是如何實現(xiàn)偷梁換柱的?我們可以點開對應的jar纳猫,如圖所示:這個jar的包名命名都和jcl的一樣婆咸,目的是實現(xiàn)偷梁換柱,強制不使用jcl的api芜辕,而實現(xiàn)slf4j
ok尚骄,可以歸納統(tǒng)一項目使用slf4j的過程,首先系統(tǒng)還是用排除其它日志實現(xiàn)jar侵续,然后引入橋接的jar倔丈,等覆蓋了之后,就可以加上對應的實現(xiàn)jar包状蜗,實現(xiàn)日志打印
4需五、Springboot日志場景啟動器
ok,有了前面的知識后轧坎,我們可以繼續(xù)學習Springboot的日志實現(xiàn)了宏邮,從前面的知識可以知道,slf4j只是一個日志門面工程缸血,并非實現(xiàn)蜀铲,在很多項目里都有日志框架混用的情況,針對此種起來属百,可以加入一些橋接的偷梁換柱jar记劝,然后再加上對應的實現(xiàn)jar就可以
然后Springboot其實也是類似這種實現(xiàn),首先族扰,Springboot默認使用slf4j作為門面工程厌丑,在實現(xiàn)過程也是有用這些偷梁換柱的橋接jar進行slf4j統(tǒng)一,然后再引用logback作為日志實現(xiàn)的jar渔呵,先快速創(chuàng)建一個Springboot項目:Springboot系列之快速創(chuàng)建項目教程
創(chuàng)建好項目之后怒竿,是默認會引入日志框架的,首先在pom文件扩氢,右鍵->maven->show dependencies顯示jar依賴圖
如圖所示耕驰,Springboot的場景啟動項目spring-boot-strater集成了spring-boot-strater-logging,spring-boot-strater-logging都是以logback為默認的日志實現(xiàn)框架录豺,當然本博客是以Springboot2.2.1.RELEASE版本為例子的
當然每個版本的實現(xiàn)略有不同朦肘,不過基本都一致,給出尚硅谷老師給的圖片:
ok双饥,Springboot項目已經(jīng)對日志做了一個比較好的兼容媒抠,還有一個日志jar沖突問題需要注意,因為Springboot項目是統(tǒng)一為slf4j門面的咏花,很顯然Springboot在項目實現(xiàn)中就已經(jīng)做了其它日志jar門面的排除趴生,比如spring項目就已經(jīng)將jcljar排除了,如圖:
所以,在項目使用中苍匆,引入其它的jar刘急,都要考慮是否有對應的日志實現(xiàn)jar,要做必要的排除浸踩,以免造成jar沖突
ok叔汁,這篇博客是對常用日志框架的介紹,有了這些必要的知識之后民轴,就可以實踐一下了,詳情的可以參數(shù)我的博客球订,SpringBoot系列日志框架使用教程