幾乎在每一個jar包裏均可以看到log4j的身影,在多個子工程構成項目中,slf4j相關的衝突時不時就跳出來讓你不爽,那麼slf4j-api、slf4j-log4j12還有log4j他們是什麼關係?我把本身瞭解的和你們簡單分享一下:java
slf4j:Simple Logging Facade for Java,爲java提供的簡單日誌Facade。Facade:門面,更底層一點說就是接口。他容許用戶以本身的喜愛,在工程中經過slf4j接入不一樣的日誌系統。更直觀一點,slf4j是個數據線,一端嵌入程序,另外一端連接日誌系統,從而實現將程序中的信息導入到日誌系統並記錄。 api
所以,slf4j入口就是衆多接口的集合,他不負責具體的日誌實現,只在編譯時負責尋找合適的日誌系統進行綁定。具體有哪些接口,所有都定義在slf4j-api中。查看slf4j-api源碼就能夠發現,裏面除了public final class LoggerFactory類以外,都是接口定義。所以,slf4j-api本質就是一個接口定義。微信
下圖比較清晰的描述了他們之間的關係:框架
當系統採用log4j做爲日誌框架實現的調用關係:ide
首先系統包含slf4j-api做爲日誌接入的接口;url
at compile時slf4j-api中public final class LoggerFactor類中spa
private final static void bind() 方法會尋找具體的日誌實現類綁定,主要經過
StaticLoggerBinder.getSingleton();語句調用.net
slf4j-log4j12:連接slf4j-api和log4j中間的適配器。它實現了slf4j-apiz中StaticLoggerBinder接口,從而使得在編譯時綁定的是slf4j-log4j12的getSingleton()方法日誌
log4j:這個是具體的日誌系統。經過slf4j-log4j12初始化Log4j,達到最終日誌的輸出。xml
頂
SLF4J+Log4J。
須要的配置文件和組件包,下面三個 jar 文件和一個 properties 文件都是要放在項目的 ClassPath 上。
1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties(也能夠是 log4j.xml,本例中用 log4j.propertes)
package com.unmi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestSlf4j { private static final Logger logger = LoggerFactory.getLogger(TestSlf4j.class); public static void main(String[] args) { logger.info("Hello {}","SLF4J"); } }
總結:項目中單獨引入log4j.jar日誌系統就能夠,而slf4j主要是爲融合其餘日誌系統。