日誌框架學習(1)— Java常用日誌框架介紹
阿新 • • 發佈:2019-02-12
日誌概述
對於一個應用程式來說日誌記錄是必不可少的一部分。線上問題追蹤,基於日誌的業務邏輯統計分析等都離不日誌。java領域存在多種日誌框架,目前常用的日誌框架包括Log4j,Log4j 2,Commons Logging,Slf4j,Logback,Jul。
常用日誌框架類別介紹
- Log4j Apache Log4j是一個基於Java的日誌記錄工具。它是由Ceki Gülcü首創的,現在則是Apache軟體基金會的一個專案。 Log4j是幾種Java日誌框架之一;
- Log4j 2 Apache Log4j 2是apache開發的一款Log4j的升級產品;
- Commons Logging
- Slf4j 類似於Commons Logging,是一套簡易Java日誌門面,本身並無日誌的實現。(Simple Logging Facade for Java,縮寫Slf4j);
- Logback 一套日誌元件的實現(slf4j陣營);
- Jul (Java Util Logging),自Java1.4以來的官方日誌實現。
常用日誌框架歷史
- 1996年早期,歐洲安全電子市場專案組決定編寫它自己的
程式跟蹤API
(Tracing API)。經過不斷的完善,這個API終於成為一個十分受歡迎的Java日誌軟體包,即Log4j
Log4j
成為Apache基金會專案中的一員; - 期間
Log4j
近乎成了Java社群的日誌標準。據說Apache基金會還曾經建議sun引入Log4j
到java的標準庫中,但Sun拒絕了。 - 2002年Java1.4釋出,Sun推出了自己的日誌庫
JUL
(Java Util Logging),其實現基本模仿了Log4j的實現。在JUL
出來以前,log4j
就已經成為一項成熟的技術,使得log4j
在選擇上佔據了一定的優勢; - 接著,Apache推出了
Jakarta Commons Logging
,JCL
只是定義了一套日誌介面(其內部也提供一個Simple Log的簡單實現),支援執行時動態載入日誌元件的實現,也就是說,在你應用程式碼裡,只需呼叫Commons Logging
log4j
,也可以是Java Util Logging
; - 後來(2006年),Ceki Gülcü不適應Apache的工作方式,離開了Apache。然後先後建立了
slf4j
(日誌門面介面,類似於Commons Logging)和Logback(Slf4j的實現)兩個專案,並回瑞典建立了QOS公司,QOS官網上是這樣描述Logback的:The Generic,Reliable Fast&Flexible Logging Framework(一個通用,可靠,快速且靈活的日誌框架); - 現今,Java日誌領域被劃分為兩大陣營:Commons Logging陣營和SLF4J陣營。 Commons Logging在Apache大樹的籠罩下,有很大的使用者基數。但有證據表明,形式正在發生變化。2013年底有人分析了GitHub上30000個專案,統計出了最流行的100個Libraries,可以看出slf4j的發展趨勢更好:
- Apache眼看有被Logback反超的勢頭,於2012-07重寫了log4j 1.x,成立了新的專案Log4j 2。Log4j 2具有logback的所有特性。
java常用日誌框架之間的關係
Log4j2
與Log4j1
發生了很大的變化,log4j2
不相容log4j1
;Commons Logging
和Slf4j
是日誌門面。log4j
和Logback
則是具體的日誌實現方案。可以簡單的理解為介面與介面的實現,呼叫這隻需要關注介面而無需關注具體的實現,做到解耦;- 比較常用的組合使用方式是
Slf4j
與Logback
組合使用,Commons Logging
與Log4j
組合使用; Logback
必須配合Slf4j
使用。由於Logback
和Slf4j
是同一個作者,其相容性不言而喻。
門面模式是軟體工程中常用的一種軟體設計模式,也被稱為正面模式、外觀模式。它為子系統中的一組介面提供一個統一的高層介面,使得子系統更容易使用。
Commons Logging與Slf4j實現機制對比
Commons logging實現機制
Commons logging
是通過動態查詢機制,在程式執行時,使用自己的ClassLoader
尋找和載入本地具體的實現。詳細策略可以檢視commons-logging-*.jar
包中的org.apache.commons.logging.impl.LogFactoryImpl.java檔案。由於OSGi
不同的外掛使用獨立的ClassLoader
,OSGI
的這種機制保證了外掛互相獨立, 其機制限制了commons logging
在OSGi
中的正常使用。
Slf4j實現機制
Slf4j在編譯期間,靜態繫結本地的LOG庫,因此可以在OSGi
中正常使用。它是通過查詢類路徑下org.slf4j.impl.StaticLoggerBinder,然後繫結工作都在這類裡面進。
如何在專案中選擇日誌框架
如果是在一個新的專案中建議使用Slf4j
與Logback
組合,這樣有如下的幾個優點:
Slf4j
實現機制決定Slf4j
限制較少,使用範圍更廣。由於Slf4j
在編譯期間,靜態繫結本地的LOG庫使得通用性要比Commons logging
要好;Logback
擁有更好的效能。Logback聲稱:某些關鍵操作,比如判定是否記錄一條日誌語句的操作,其效能得到了顯著的提高。這個操作在Logback
中需要3納秒,而在Log4J
中則需要30納秒。LogBack建立記錄器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它獲取已存在的記錄器只需94納秒,而Log4J
需要2234納秒,時間減少到了1/23。跟JUL
相比的效能提高也是顯著的。Commons Logging
開銷更高 在使用Commons Logging
時為了減少構建日誌資訊的開銷,通常的做法是:
if(log.isDebugEnabled()){
log.debug("User name: " + user.getName() + " buy goods id :" + good.getId());
}
在Slf4j陣營,你只需這麼做:
log.debug("User name:{} ,buy goods id :{}", user.getName(),good.getId());
也就是說,slf4j
把構建日誌的開銷放在了它確認需要顯示這條日誌之後,減少記憶體和cup的開銷,使用佔位符號,程式碼也更為簡潔。
Logback
文件免費。Logback
的所有文件是全面免費提供的,不象Log4J
那樣只提供部分免費文件而需要使用者去購買付費文件。