幾乎在每個jar包里都可以看到log4j的身影,在多個子工程構成項目中,slf4j相關的沖突時不時就跳出來讓你不爽,那么slf4j-api、slf4j-log4j12還有l(wèi)og4j他們是什么關系?我把自己了解的和大家簡單分享一下:
slf4j:Simple Logging Facade for Java,為java提供的簡單日志Facade。Facade:門面,更底層一點說就是接口。他允許用戶以自己的喜好,在工程中通過slf4j接入不同的日志系統(tǒng)。更直觀一點,slf4j是個數(shù)據(jù)線,一端嵌入程序,另一端鏈接日志系統(tǒng),從而實現(xiàn)將程序中的信息導入到日志系統(tǒng)并記錄。
因此,slf4j入口就是眾多接口的集合,他不負責具體的日志實現(xiàn),只在編譯時負責尋找合適的日志系統(tǒng)進行綁定。具體有哪些接口,全部都定義在slf4j-api中。查看slf4j-api源碼就可以發(fā)現(xiàn),里面除了public final class LoggerFactory類之外,都是接口定義。因此,slf4j-api本質就是一個接口定義。
下圖比較清晰的描述了他們之間的關系:

當系統(tǒng)采用log4j作為日志框架實現(xiàn)的調用關系:
首先系統(tǒng)包含slf4j-api作為日志接入的接口;
at compile時slf4j-api中public final class LoggerFactor類中
private final static void bind() 方法會尋找具體的日志實現(xiàn)類綁定,主要通過
StaticLoggerBinder.getSingleton();語句調用
slf4j-log4j12:鏈接slf4j-api和log4j中間的適配器。它實現(xiàn)了slf4j-apiz中StaticLoggerBinder接口,從而使得在編譯時綁定的是slf4j-log4j12的getSingleton()方法
log4j:這個是具體的日志系統(tǒng)。通過slf4j-log4j12初始化Log4j,達到最終日志的輸出。
posted on 2014-04-13 09:17
永志歌德 閱讀(630)
評論(0) 編輯 收藏