Java常用日志框架总结
在項目開發中,日志十分的重要,不管是記錄運行情況還是定位線上問題,都離不開對日志的分析。在 Java 領域里存在著多種日志框架,如 JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback 等等。今天就介紹幾種比較常用的日志框架。
日志介紹
日志概念
日志:在計算機領域,日志文件(logfile)是一個記錄了發生在運行中的操作系統或其他軟件中的事件的文件,或者記錄了在網絡聊天軟件的用戶之間發送的消息。
日志記錄(Logging):是指保存日志的行為。最簡單的做法是將日志寫入單個存放日志的文件。
日志級別
- 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常用日志框架關系
- Log4j 2與Log4j 1都是Apache旗下的日志框架,Log4j 2與Log4j 1發生了很大的變化,Log4j 2不兼容Log4j 1。
- Commons Logging和Slf4j是日志門面(門面模式是軟件工程中常用的一種軟件設計模式,也被稱為正面模式、外觀模式。它為子系統中的一組接口提供一個統一的高層接口,使得子系統更容易使用)。Log4j和Logback則是具體的日志實現方案。可以簡單的理解為接口與接口的實現,調用者只需要關注接口而無需關注具體的實現,做到解耦。
- 比較常用的組合使用方式是Slf4j與Logback組合使用,Commons Logging與Log4j組合使用。
- Logback必須配合Slf4j使用。由于Logback和Slf4j是同一個作者,其兼容性不言而喻。
JDK自帶了logging,log4j1、log4j2、logback ,這些框架都自己定制了日志 API ,并且有相應的實現;目前用于實現日志統一的框架 Apache commons-logging、slf4j ,遵循面向接口編程的原則,這兩大框架可以讓用戶在程序運行期間去選擇具體的日志實現系統(log4j1\log4j2\logback等)來記錄日志,是統一抽象出來的一些接口。
日志門面框架
日志門面:是門面模式的一個典型的應用,門面模式,也稱外觀模式,請參照我的博文設計模式之外觀模式,日志門面框架就使一套提供了日志相關功能的接口而無具體實現的框架,其調用具體的實現框架來進行日志記錄。也就是說日志門面天然的兼容日志實現框架。典型的日志門面就是Commons Logging、SLF4J。
日志門面的優點:
日志門面是介于具體的日志框架與系統之間的橋梁,通過日志門面框架的應用實現了系統與具體實現日志框架的解耦。無論具體實現的日志框架如何變化,都不會影響系統日志的記錄功能,更無須更改系統代碼,符合“開放-閉合原則”。
現今,Java日志領域被劃分為兩大陣營: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ü.
我們看一下Commons Logging與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,然后在StaticLoggerBinder中進行綁定。
日志實現框架
- Jul:Java Util Logging,自Java1.4以來的官方日志實現。
- Apache Log4j是一個基于Java的日志記錄工具。它是由Ceki Gülcü首創的,現在則是Apache軟件基金會的一個項目。
- Apache Log4j 2是apache開發的一款Log4j的升級產品,并且不兼容Log4j。
- Logback是一個日志框架,Log4j是同一作者,都出自Ceki Gülcü之手。
Java 日志框架的選擇
- 成本考慮:Logback文檔免費。Logback的所有文檔是全面免費提供的,不象Log4J那樣只提供部分免費文檔而需要用戶去購買付費文檔。
- 資源開銷:Commons Logging相比較與SLF4J開銷更高.
- 性能:Logback相比Log4j、Log4j2擁有更好的性能。Logback聲稱:某些關鍵操作,比如判定是否記錄一條日志語句的操作,其性能得到了顯著的提高。這個操作在Logback中需要3納秒,而在Log4J中則需要30納秒。LogBack創建記錄器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它獲取已存在的記錄器只需94納秒,而Log4J需要2234納秒,時間減少到了1/23。跟JUL相比的性能提高也是顯著的。
總結
以上是生活随笔為你收集整理的Java常用日志框架总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电气工程及其自动化能考公务员吗
- 下一篇: 如何写一部科幻小说(小说的三大要素和功能