1. 程式人生 > >Java常用日誌框架基礎介紹

Java常用日誌框架基礎介紹

Apache Commons Logging

Apache Commons Logging又叫做JakartaCommons Logging (JCL),它本身提供了簡單的日誌操作,但是它的主要作用是提供了一個日誌操作門面介面,即讓開發者不依賴具體的日誌操作框架,可以根據需要切換日誌框架。JCL不是具體的日誌操作框架,而是一個日誌門面框架。JCL對一些常用的日誌操作框架進行了簡單的封裝,包括Log4J, Avalon LogKit, and JDK等。比如我們在使用log4j作為日誌輸出框架,就會在java檔案中明確的引入具體的org.apache.log4j.Logger類,如果我們在想切換到其它日誌操作框架會對程式翻天覆地的修改。而我們引入org.apache.commons.logging.Log,然後配置commons-loggin.properties配置檔案來指定具體使用那個日誌框架,在切換日誌框架時,值需要更改配置檔案即可。
JCL有兩個基本的類:Log(日誌記錄器)和LogFactory(負責建立Log例項)。當commons-logging.jar被加入到CLASSPATH之後,它會合理地猜測你想用的日誌工具,然後進行自我設定,使用者根本不需要做任何設定。

JCL尋找具體日誌框架的規則

JCL會按照下面的步驟去尋找程式使用的日誌框架,找到第一個後將終止尋找。 1,尋找當前專案src下commons-logging.properties配置檔案中名叫org.apache.commons.logging.Log配置屬性的值
2,尋找系統中屬性中名叫org.apache.commons.logging.Log的值
3,如果應用程式的classpath中有log4j,則使用相關的包裝(wrapper)類(Log4JLogger)
4,如果應用程式執行在jdk1.4的系統中,使用相關的包裝類(Jdk14Logger)
5,使用簡易日誌包裝類(SimpleLog),JCL自帶的簡單日誌操作功能

commons-logging.properties配置檔案、

#使用JDK java.util.logging.Logger作為日誌框架
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
#使用log4j作為日誌框架,對於老的版本使用org.apache.commons.logging.impl.Log4JCategoryLog
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
#使用JCL自帶的簡單日誌框架
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
對於JCL具體可以適配那些日誌框架,可以到commons-logging JAR包中去檢視,如圖:

注意如果使用了那種日誌框架,需要在工程中匯入對應日誌框架的JAR包。

log4j與JCL

JCT和log4j在使用時,通過包名我們可以發現它們都是 apache 的專案,既然如此,為何要動如此大的動作搞兩個東西(指的是 commons-logging 和 log4j)出來呢?
事實上,在 sun 開發 logger(JDK自帶的日誌系統) 前,apache 專案已經開發了功能強大的 log4j 日誌工具,並向 sun 推薦將其納入到 jdk 的一部分,可是 sun 拒絕了 apache 的提議,sun 後來自己開發了一套記錄日誌的工具。可是現在的開源專案都使用的是 log4j,log4j 已經成了事實上的標準,但由於又有一部分開發者在使用 sun logger,因此 apache 才推出 commons-logging,使得我們不必關注我們正在使用何種日誌工具。

SLF4J

SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌記錄系統,它只服務於各種各樣的日誌系統。和JCL是一個性質的,SLF4J從名字上就表明了其含義和作用。按照官方的說法,SLF4J是一個用於日誌系統的簡單Facade(門面),允許終端使用者在部署其應用時使用其所希望的日誌系統。

SLF4J和JCL一樣,提供Logger(日誌記錄器)和LoggerFactory(負責建立Log例項)的工廠類。具體的日誌的輸出形式、記錄級別、輸出方法都由具體的日誌框架配置完成。

SFL4J可適配的具體日誌系統


SFL4J包的構成

使用SFL4J需要匯入三個部分jar包:
1,slf4j-api-1.7.12.jar,提供了Logger介面和LoggerFactory工廠類。
2,slf4j-使用的具體日誌系統名稱-x.x.x.jar,實現了slf4j-api-1.7.12.jar中的Logger介面,並對具體的日誌做適配,將slf4j和具體的日誌系統聯絡起來。
3,具體的日誌系統相關jar包。

slf4j+具體的日誌組合需要匯入的jar

使用SLF4J需要匯入slf4j-api-x.x.x.jar、具體日誌系統適配jar、日誌系統jar。下面給了幾個slf4j+具體的日誌系統實現日誌操作需要匯入的包。slf4j-api-x.x.x.jar是必須匯入的。
1,使用log4j:log4j-1.2.17、slf4j-log4j12-1.7.12.jar
2,使用JDK自帶的日誌系統:slf4j-jdk14-1.7.12.jar
3,使用slf4j自帶的簡單日誌輸出系統:slf4j-simple-1.7.12.jar
以此類推...
如果工程中匯入了多個適配包,SLF4J會給出如下提示:SLF4J: Class path contains multiple SLF4J bindings.並把每個日誌系統都輸出來。

將現有的日誌系統切換到SLF4J

假如我們使用了JCL+log4j的方式作日誌操作框架,那我們的工程依賴的log4j還是JCL?
工程中匯入那個日誌框架的類,就說明工程依賴那個日誌框架。例如我們工程中出現了這樣一段程式碼:
import org.apache.commons.logging.LogFactory;
public class LogTest1 {
	private static final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory.getLog(LogTest1.class);
	public static void main(String [] args){
		String aa = LogFactory.FACTORY_DEFAULT;
		logger.info("hi,我是程式猿。"+aa);
	}
}
這段程式碼說明工程依賴JCL。
如果匯入import org.apache.log4j.Logger;說明依賴log4j。
現在我們想要更換系統日誌門面框架,使用SLF4j替代JCL日誌門面框架。只需要匯入JCL對應的SLF4J橋接包,在刪除JCL jar包即可。具體步驟如下:
SLF4J替換JCL:匯入jcl-over-slf4j-1.7.12.jar,刪除commons-logging-1.1.1.jar。 如果我們想使用SLF4J替換log4j,具體步驟如下:
SLF4J替換log4j:匯入log4j-over-slf4j-1.7.12.jar,刪除log4j-1.2.17.jar。
切換到了SLF4J,我們就可以按照SLF4J的方式(詳見章節3)選擇具體使用那種日誌了。各種日誌間的切換變得異常簡單。在比如從log4j切換到slf4j提供的簡單的日誌系統的步驟:
1,匯入橋接包log4j-over-slf4j-1.7.12.jar
2,刪除log4j-1.2.17.jar
3,匯入slf4j-api-1.6.6.jar
4,匯入slf4j-simple-1.7.12.jar
ps:logback日誌框架和slf4j的作者是同一個人。 參考文章: slf4j-1.7.12.zip 下載地址: