Java常用日志框架总结
在項(xiàng)目開發(fā)中,日志十分的重要,不管是記錄運(yùn)行情況還是定位線上問題,都離不開對日志的分析。在 Java 領(lǐng)域里存在著多種日志框架,如 JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback 等等。今天就介紹幾種比較常用的日志框架。
日志介紹
日志概念
日志:在計算機(jī)領(lǐng)域,日志文件(logfile)是一個記錄了發(fā)生在運(yùn)行中的操作系統(tǒng)或其他軟件中的事件的文件,或者記錄了在網(wǎng)絡(luò)聊天軟件的用戶之間發(fā)送的消息。
日志記錄(Logging):是指保存日志的行為。最簡單的做法是將日志寫入單個存放日志的文件。
日志級別
- FATAL — 表示需要立即被處理的系統(tǒng)級錯誤。當(dāng)該錯誤發(fā)生時,表示服務(wù)已經(jīng)出現(xiàn)了某種程度的不可用,系統(tǒng)管理員需要立即介入。這屬于最嚴(yán)重的日志級別,因此該日志級別必須慎用,如果這種級別的日志經(jīng)常出現(xiàn),則該日志也失去了意義。通常情況下,一個進(jìn)程的生命周期中應(yīng)該只記錄一次FATAL級別的日志,即該進(jìn)程遇到無法恢復(fù)的錯誤而退出時。當(dāng)然,如果某個系統(tǒng)的子系統(tǒng)遇到了不可恢復(fù)的錯誤,那該子系統(tǒng)的調(diào)用方也可以記入FATAL級別日志,以便通過日志報警提醒系統(tǒng)管理員修復(fù);
- ERROR — 該級別的錯誤也需要馬上被處理,但是緊急程度要低于FATAL級別。當(dāng)ERROR錯誤發(fā)生時,已經(jīng)影響了用戶的正常訪問。從該意義上來說,實(shí)際上ERROR錯誤和FATAL錯誤對用戶的影響是相當(dāng)?shù)摹ATAL相當(dāng)于服務(wù)已經(jīng)掛了,而ERROR相當(dāng)于好死不如賴活著,然而活著卻無法提供正常的服務(wù),只能不斷地打印ERROR日志。特別需要注意的是,ERROR和FATAL都屬于服務(wù)器自己的異常,是需要馬上得到人工介入并處理的。而對于用戶自己操作不當(dāng),如請求參數(shù)錯誤等等,是絕對不應(yīng)該記為ERROR日志的;
- WARN — 該日志表示系統(tǒng)可能出現(xiàn)問題,也可能沒有,這種情況如網(wǎng)絡(luò)的波動等。對于那些目前還不是錯誤,然而不及時處理也會變?yōu)殄e誤的情況,也可以記為WARN日志,例如一個存儲系統(tǒng)的磁盤使用量超過閥值,或者系統(tǒng)中某個用戶的存儲配額快用完等等。對于WARN級別的日志,雖然不需要系統(tǒng)管理員馬上處理,也是需要及時查看并處理的。因此此種級別的日志也不應(yīng)太多,能不打WARN級別的日志,就盡量不要打;
- INFO — 該種日志記錄系統(tǒng)的正常運(yùn)行狀態(tài),例如某個子系統(tǒng)的初始化,某個請求的成功執(zhí)行等等。通過查看INFO級別的日志,可以很快地對系統(tǒng)中出現(xiàn)的 WARN,ERROR,FATAL錯誤進(jìn)行定位。INFO日志不宜過多,通常情況下,INFO級別的日志應(yīng)該不大于TRACE日志的10%;
- DEBUG or TRACE — 這兩種日志具體的規(guī)范應(yīng)該由項(xiàng)目組自己定義,該級別日志的主要作用是對系統(tǒng)每一步的運(yùn)行狀態(tài)進(jìn)行精確的記錄。通過該種日志,可以查看某一個操作每一步的執(zhí) 行過程,可以準(zhǔn)確定位是何種操作,何種參數(shù),何種順序?qū)е铝四撤N錯誤的發(fā)生。可以保證在不重現(xiàn)錯誤的情況下,也可以通過DEBUG(或TRACE)級別的日志對問題進(jìn)行診斷。需要注意的是,DEBUG日志也需要規(guī)范日志格式,應(yīng)該保證除了記錄日志的開發(fā)人員自己外,其他的如運(yùn)維,測試人員等也可以通過 DEBUG(或TRACE)日志來定位問題;
日志級別優(yōu)先級:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
日志作用
日志記錄了系統(tǒng)行為的時間、地點(diǎn)、狀態(tài)等相關(guān)信息,能夠幫助我們了解并監(jiān)控系統(tǒng)狀態(tài),在發(fā)生錯誤或者接近某種危險狀態(tài)時能夠及時提醒我們處理,同時在系統(tǒng)產(chǎn)生問題時,能夠幫助我們快速的定位、診斷并解決問題。
Java中常用日志框架
在Java程序中常用日志框架可以分為兩類:
- 無具體實(shí)現(xiàn)的抽象門面框架,如:Commons Logging、SLF4J
- 具體實(shí)現(xiàn)的框架,如:Log4j,Log4j 2,Logback,Jul
java常用日志框架關(guān)系
- Log4j 2與Log4j 1都是Apache旗下的日志框架,Log4j 2與Log4j 1發(fā)生了很大的變化,Log4j 2不兼容Log4j 1。
- Commons Logging和Slf4j是日志門面(門面模式是軟件工程中常用的一種軟件設(shè)計模式,也被稱為正面模式、外觀模式。它為子系統(tǒng)中的一組接口提供一個統(tǒng)一的高層接口,使得子系統(tǒng)更容易使用)。Log4j和Logback則是具體的日志實(shí)現(xiàn)方案。可以簡單的理解為接口與接口的實(shí)現(xiàn),調(diào)用者只需要關(guān)注接口而無需關(guān)注具體的實(shí)現(xiàn),做到解耦。
- 比較常用的組合使用方式是Slf4j與Logback組合使用,Commons Logging與Log4j組合使用。
- Logback必須配合Slf4j使用。由于Logback和Slf4j是同一個作者,其兼容性不言而喻。
JDK自帶了logging,log4j1、log4j2、logback ,這些框架都自己定制了日志 API ,并且有相應(yīng)的實(shí)現(xiàn);目前用于實(shí)現(xiàn)日志統(tǒng)一的框架 Apache commons-logging、slf4j ,遵循面向接口編程的原則,這兩大框架可以讓用戶在程序運(yùn)行期間去選擇具體的日志實(shí)現(xiàn)系統(tǒng)(log4j1\log4j2\logback等)來記錄日志,是統(tǒng)一抽象出來的一些接口。
日志門面框架
日志門面:是門面模式的一個典型的應(yīng)用,門面模式,也稱外觀模式,請參照我的博文設(shè)計模式之外觀模式,日志門面框架就使一套提供了日志相關(guān)功能的接口而無具體實(shí)現(xiàn)的框架,其調(diào)用具體的實(shí)現(xiàn)框架來進(jìn)行日志記錄。也就是說日志門面天然的兼容日志實(shí)現(xiàn)框架。典型的日志門面就是Commons Logging、SLF4J。
日志門面的優(yōu)點(diǎn):
日志門面是介于具體的日志框架與系統(tǒng)之間的橋梁,通過日志門面框架的應(yīng)用實(shí)現(xiàn)了系統(tǒng)與具體實(shí)現(xiàn)日志框架的解耦。無論具體實(shí)現(xiàn)的日志框架如何變化,都不會影響系統(tǒng)日志的記錄功能,更無須更改系統(tǒng)代碼,符合“開放-閉合原則”。
現(xiàn)今,Java日志領(lǐng)域被劃分為兩大陣營:Commons Logging陣營和Slf4j陣營。
- Commons Logging:Apache Commons Logging是一個基于Java的日志記錄實(shí)用程序,是用于日志記錄和其他工具包的編程模型。它通過其他一些工具提供API,日志實(shí)現(xiàn)和包裝器實(shí)現(xiàn)。
- SLF4J:Java簡易日志門面(Simple Logging Facade for Java,縮寫SLF4J),是一套包裝Logging 框架的界面程式,以外觀模式實(shí)現(xiàn)。可以在軟件部署的時候決定要使用的 Logging 框架,目前主要支援的有Java Logging API、Log4j及l(fā)ogback等框架。以MIT 授權(quán)方式發(fā)布。SLF4J 的作者就是 Log4j和Logback 的作者 Ceki Gülcü.
我們看一下Commons Logging與Slf4j實(shí)現(xiàn)機(jī)制對比。
Commons Logging與Slf4j實(shí)現(xiàn)機(jī)制對比
Commons Logging實(shí)現(xiàn)機(jī)制
Commons Logging是通過動態(tài)查找機(jī)制,在程序運(yùn)行時,使用自己的ClassLoader尋找和載入本地具體的實(shí)現(xiàn)。詳細(xì)策略可以查看commons-logging-*.jar包中的org.apache.commons.logging.impl.LogFactoryImpl.java文件。由于Osgi不同的插件使用獨(dú)立的ClassLoader,Osgi的這種機(jī)制保證了插件互相獨(dú)立, 其機(jī)制限制了Commons Logging在Osgi中的正常使用。
Slf4j實(shí)現(xiàn)機(jī)制
Slf4j在編譯期間,靜態(tài)綁定本地的Log庫,因此可以在Osgi中正常使用。它是通過查找類路徑下org.slf4j.impl.StaticLoggerBinder,然后在StaticLoggerBinder中進(jìn)行綁定。
日志實(shí)現(xiàn)框架
- Jul:Java Util Logging,自Java1.4以來的官方日志實(shí)現(xiàn)。
- Apache Log4j是一個基于Java的日志記錄工具。它是由Ceki Gülcü首創(chuàng)的,現(xiàn)在則是Apache軟件基金會的一個項(xiàng)目。
- Apache Log4j 2是apache開發(fā)的一款Log4j的升級產(chǎn)品,并且不兼容Log4j。
- Logback是一個日志框架,Log4j是同一作者,都出自Ceki Gülcü之手。
Java 日志框架的選擇
- 成本考慮:Logback文檔免費(fèi)。Logback的所有文檔是全面免費(fèi)提供的,不象Log4J那樣只提供部分免費(fèi)文檔而需要用戶去購買付費(fèi)文檔。
- 資源開銷:Commons Logging相比較與SLF4J開銷更高.
- 性能:Logback相比Log4j、Log4j2擁有更好的性能。Logback聲稱:某些關(guān)鍵操作,比如判定是否記錄一條日志語句的操作,其性能得到了顯著的提高。這個操作在Logback中需要3納秒,而在Log4J中則需要30納秒。LogBack創(chuàng)建記錄器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它獲取已存在的記錄器只需94納秒,而Log4J需要2234納秒,時間減少到了1/23。跟JUL相比的性能提高也是顯著的。
總結(jié)
以上是生活随笔為你收集整理的Java常用日志框架总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电气工程及其自动化能考公务员吗
- 下一篇: 如何写一部科幻小说(小说的三大要素和功能