Java系統中常用日誌框架

日誌介紹

日誌概念

日誌:在計算機領域,日誌文件(logfile)是一個記錄了發生在運行中的操作系統或其他軟件中的事件的文件,或者記錄了在網絡聊天軟件的用戶之間發送的消息1

日誌記錄(Logging):是指保存日誌的行爲。最簡單的做法是將日誌寫入單個存放日誌的文件。

日誌級別2

  • FATAL — 表示需要立即被處理的系統級錯誤。當該錯誤發生時,表示服務已經出現了某種程度的不可用,系統管理員需要立即介入。這屬於最嚴重的日誌級別,因此該日誌級別必須慎用,如果這種級別的日誌經常出現,則該日誌也失去了意義。通常情況下,一個進程的生命週期中應該只記錄一次FATAL級別的日誌,即該進程遇到無法恢復的錯誤而退出時。當然,如果某個系統的子系統遇到了不可恢復的錯誤,那該子系統的調用方也可以記入FATAL級別日誌,以便通過日誌報警提醒系統管理員修復;
  • ERROR — 該級別的錯誤也需要馬上被處理,但是緊急程度要低於FATAL級別。當ERROR錯誤發生時,已經影響了用戶的正常訪問。從該意義上來說,實際上ERROR錯誤和FATAL錯誤對用戶的影響是相當的。FATAL相當於服務已經掛了,而ERROR相當於好死不如賴活着,然而活着卻無法提供正常的服務,只能不斷地打印ERROR日誌。特別需要注意的是,ERROR和FATAL都屬於服務器自己的異常,是需要馬上得到人工介入並處理的。而對於用戶自己操作不當,如請求參數錯誤等等,是絕對不應該記爲ERROR日誌的;
  • WARN — 該日誌表示系統可能出現問題,也可能沒有,這種情況如網絡的波動等。對於那些目前還不是錯誤,然而不及時處理也會變爲錯誤的情況,也可以記爲WARN日誌,例如一個存儲系統的磁盤使用量超過閥值,或者系統中某個用戶的存儲配額快用完等等。對於WARN級別的日誌,雖然不需要系統管理員馬上處理,也是需要及時查看並處理的。因此此種級別的日誌也不應太多,能不打WARN級別的日誌,就儘量不要打;
  • INFO — 該種日誌記錄系統的正常運行狀態,例如某個子系統的初始化,某個請求的成功執行等等。通過查看INFO級別的日誌,可以很快地對系統中出現的 WARN,ERROR,FATAL錯誤進行定位。INFO日誌不宜過多,通常情況下,INFO級別的日誌應該不大於TRACE日誌的10%;
  • DEBUG or TRACE — 這兩種日誌具體的規範應該由項目組自己定義,該級別日誌的主要作用是對系統每一步的運行狀態進行精確的記錄。通過該種日誌,可以查看某一個操作每一步的執 行過程,可以準確定位是何種操作,何種參數,何種順序導致了某種錯誤的發生。可以保證在不重現錯誤的情況下,也可以通過DEBUG(或TRACE)級別的日誌對問題進行診斷。需要注意的是,DEBUG日誌也需要規範日誌格式,應該保證除了記錄日誌的開發人員自己外,其他的如運維,測試人員等也可以通過 DEBUG(或TRACE)日誌來定位問題;

日誌級別優先級:

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

日誌作用

日誌記錄了系統行爲的時間、地點、狀態等相關信息,能夠幫助我們瞭解並監控系統狀態,在發生錯誤或者接近某種危險狀態時能夠及時提醒我們處理,同時在系統產生問題時,能夠幫助我們快速的定位、診斷並解決問題。

Java中常用日誌框架

在Java程序中常用日誌框架可以分爲兩類:

  • 無具體實現的抽象門面框架,如:Commons Logging、SLF4J
  • 具體實現的框架,如:Log4j,Log4j 2,Logback,Jul

Java常用日誌框架歷史:

  • 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

Apache Commons Logging是一個基於Java的日誌記錄實用程序,是用於日誌記錄和其他工具包的編程模型。它通過其他一些工具提供API,日誌實現和包裝器實現。

SLF4J

Java簡易日誌門面(Simple Logging Facade for Java,縮寫SLF4J),是一套包裝Logging 框架的界面程式,以外觀模式實現。可以在軟件部署的時候決定要使用的 Logging 框架,目前主要支援的有Java Logging API、Log4j及logback等框架。以MIT 授權方式發佈。SLF4J 的作者就是 Log4j和Logback 的作者 Ceki Gülcü.

詳細請參考我的博文日誌框架門面之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,然後綁定工作都在這類裏面進。

日誌實現框架

Jul

Jul:Java Util Logging,自Java1.4以來的官方日誌實現。

Log4j

Apache Log4j是一個基於Java的日誌記錄工具。它是由Ceki Gülcü首創的,現在則是Apache軟件基金會的一個項目。

Log4j的使用請參考我的博文日誌框架之Log4j

Log4j2

Apache Log4j 2是apache開發的一款Log4j的升級產品,並且不兼容Log4j。

Logback

Logback是一個日誌框架,Log4j是同一作者,都出自Ceki Gülcü之手。j
Logback的使用請參考我的博文日誌框架之Logback

Java 日誌框架的選擇

  1. 成本考慮:Logback文檔免費。Logback的所有文檔是全面免費提供的,不象Log4J那樣只提供部分免費文檔而需要用戶去購買付費文檔。
  2. 資源開銷:Commons Logging相比較與SLF4J開銷更高.
  3. 性能:Logback相比Log4j、Log4j2擁有更好的性能。Logback聲稱:某些關鍵操作,比如判定是否記錄一條日誌語句的操作,其性能得到了顯著的提高。這個操作在Logback中需要3納秒,而在Log4J中則需要30納秒。LogBack創建記錄器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它獲取已存在的記錄器只需94納秒,而Log4J需要2234納秒,時間減少到了1/23。跟JUL相比的性能提高也是顯著的。

  1. https://zh.wikipedia.org/zh-hans/日誌文件 ↩︎

  2. https://zhuanlan.zhihu.com/p/27363484 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章