1. 程式人生 > >slf4j-api、slf4j-log4j12、log4j的關係

slf4j-api、slf4j-log4j12、log4j的關係

在網上找到一篇關於這三個jar包的關係的部落格,講的很好,所以就轉載了:

https://blog.csdn.net/tengdazhang770960436/article/details/18006127

詳細內容如下:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

幾乎在每個jar包裡都可以看到log4j的身影,在多個子工程構成專案中,slf4j相關的衝突時不時就跳出來讓你不爽,那麼slf4j-api、slf4j-log4j12還有log4j他們是什麼關係?我把自己瞭解的和大家簡單分享一下:

slf4j:Simple Logging Facade for Java,為java提供的簡單日誌Facade。Facade:門面,更底層一點說就是介面。他允許使用者以自己的喜好,在工程中通過slf4j接入不同的日誌系統。

更直觀一點,slf4j是個資料線,一端嵌入程式,另一端連結日誌系統,從而實現將程式中的資訊匯入到日誌系統並記錄。 

因此,slf4j入口就是眾多介面的集合,他不負責具體的日誌實現,只在編譯時負責尋找合適的日誌系統進行繫結。具體有哪些介面,全部都定義在slf4j-api中。

檢視slf4j-api原始碼就可以發現,裡面除了public final class LoggerFactory類之外,都是介面定義。因此,slf4j-api本質就是一個介面定義。

      

下圖比較清晰的描述了他們之間的關係:

   

     

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 當系統採用log4j作為日誌框架實現的呼叫關係:

 

    首先系統包含slf4j-api作為日誌接入的介面;

 

    編譯時slf4j-api中public final class LoggerFactor類中

    private final static void bind() 方法會尋找具體的日誌實現類繫結,主要通過
    StaticLoggerBinder.getSingleton();語句呼叫

    

   slf4j-log4j12:連結slf4j-api和log4j中間的介面卡。它實現了slf4j-apiz中StaticLoggerBinder介面,從而使得在編譯時繫結的是slf4j-log4j12的getSingleton()方法

   log4j:這個是具體的日誌系統。通過slf4j-log4j12初始化Log4j,達到最終日誌的輸出。