1. 程式人生 > >slf4j-api、slf4j-log4j12以及log4j三者之間是什麼關係?

slf4j-api、slf4j-log4j12以及log4j三者之間是什麼關係?

幾乎在每個專案裡都可以看到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作為日誌接入的介面;

at compile時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,達到最終日誌的輸出。