Spring5新特性之日誌體系

日誌系統對於各大主流框架或是自己的應用中都是不可或缺的重要組成部分,最近比較關注spring,所以就來分析下spring的日誌系統以及spring4和spring5的日誌有哪些區別。

對於各種日誌技術,可參見我的另一篇文章:https://blog.csdn.net/baomw/article/details/84526738
1,我們先從spring4和5的核心包context包的依賴關係,來看看其涉及的日誌依賴包
在這裏插入圖片描述
<spring4依賴關係圖>
在這裏插入圖片描述
<spring5依賴關係圖>

從上面的依賴關係不難看出,我們spring4所依賴的jar就是我們的jcl,而spring5則依賴了一個叫spring-jcl的包,至於這個spring-jcl到底是什麼,是不是就是我們的jcl呢,我們可以通過例子來看看,這個到底是不是我們jcl的實現。

2,我們知道,jcl打印日誌有log4j時通過log4j輸出日誌,沒有則通過jul輸出日誌。
在這裏插入圖片描述在這裏插入圖片描述
通過上圖,可以知道,當加了log4j的時候,通過log4j來輸出日誌,沒加則通過jul來輸出日誌,可見spring4引入的jcl就是我們原生的jcl(原理參見我的另一篇文章,上有連接。)
在這裏插入圖片描述
可以看到,spring5就算我加了log4j的jar,依然還是通過jul來打印的日誌,說明spring-jcl至少不是我們所知道的jcl,那麼spring-jcl到底是什麼呢?我們可以斷點一下,看看拿到的log對象是什麼,然後再看看log對象是怎麼產生的即可。

2,可以看到,get到的log對象是jul
在這裏插入圖片描述
在這裏插入圖片描述

static {
        logApi = LogFactory.LogApi.JUL;
        ClassLoader cl = LogFactory.class.getClassLoader();

        try {
            cl.loadClass("org.apache.logging.log4j.spi.ExtendedLogger");
            logApi = LogFactory.LogApi.LOG4J;
        } catch (ClassNotFoundException var6) {
            try {
                cl.loadClass("org.slf4j.spi.LocationAwareLogger");
                logApi = LogFactory.LogApi.SLF4J_LAL;
            } catch (ClassNotFoundException var5) {
                try {
                    cl.loadClass("org.slf4j.Logger");
                    logApi = LogFactory.LogApi.SLF4J;
                } catch (ClassNotFoundException var4) {
                    ;
                }
            }
        }
    }

上圖及代碼爲spring-jcl的logFactory中的兩處核心代碼:
首先在初始化logFactory的時候,會去執行一個static的代碼塊,代碼也比較簡單,主要就是設置我們的logApi,默認是jul,然後依次用log4j2,slf4j-LAL,slf4j去反射判斷是否存在對應依賴,如果有則設置logApi爲對應值,否則進入catch中繼續判斷。
然後再getlog的時候,則根據logApi去獲取log對象,代碼也比較容易了,就是個switch-case,默認是我們的jul來實現。

結合我上篇文章的jcl的實現,發現還是有很大區別的,jcl是封裝了一個靜態數組,然後依次循環遍歷反射,成功則返回對應實現。

原來在spring5的時候,他將jcl給改了,也就是我們的spring-jcl(畢竟大廠,牛逼),然後默認採用了jul來做日誌輸出了。同時呢還支持slf4j,有着更好的擴展性和兼容性。

好了,關於spring5的日誌就說到這裏了。謝謝大家

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章