javaweb方向需要了解的系統日誌工具

java日誌發展史簡介:

log4j 最早得到廣泛應用的日誌工具是 log4j ,這個作者比較牛,不知道用那種的錯覺也是要拜該作者所賜,log4j的作者:Ceki Gülcü ,log4j 已經差不多成為了java日誌的標準了。

當log4j 使用廣泛的時候,Sun公司也想在日誌這裡分一杯羹,sun公司就在jdk1.4中增加了JUL(java.util.logging)日誌接口,這樣市面上就出現了兩種不同的日誌,如果一個項目中兩個相互協作的團隊使用了兩個不同的日誌工具,那麼合併項目的時候日誌問題就會很棘手;

為解決這個問題,Apache Commons Logging 開發了JCL(之前叫 Jakarta Commons Logging)將日誌工具抽象成一個接口層,該接口層可以對不同日誌工具進行適配換轉接,JCL只提供了log接口,具體的實現則在運行時動態尋找。

因此,很多項目採用 JCL + log4j 這種搭配,不過當程序規模越來越龐大之後,JCL的動態綁定並不一定總能成功,因此急需一種更優秀的日誌工具。

此時log4j的作者Ceki Gülcü又站了出來,開發出了SLF4J日誌工具,SLF4J工具採用在程序部署時靜態綁定指定日誌工具的方法來解決這一問題。

SLF4J通JCL一樣,也只是提供log接口,具體的實現是在打包應用程序時所放入的綁定名字為(slf4j-XXX-version.jar)的轉換器來決定,其中xxx可以是log4j、jcl、jul等日誌類,你只需編寫SLF4J接口的日誌,放入綁定器來轉換成其他格式的日誌。

如果現在使用的是非SLF4J日誌工具,可以橋接器(名字為XXX-over-slf4j.jar)把當前日誌組件轉換到SLF4J,SLF4J又根據綁定器把日誌交給具體的日誌實現工具。

**logback **Ceki Gülcü 還開發了一個slf4j的“親兒子”---logback,logback是一個比slf4j更加優秀的日誌工具。

log4j2 此後,Ceki Gülcü還升級了下log4j --- log4j2代替了log4j。

到此主流的日誌工具發展史基本介紹完畢了,發展過程就是:log4j -->> JUL -->> JCL -->> SLF4J -->> logback -->> log4j2

上述中提到JCL、SLF4J、logback這三都是實現了和其他日誌的轉換接口,對於性能上來說JCL性能差些、logback性能最好,這裡我們就按處於中間性能的 slf4j 的接口來說下怎麼使用。

slf4j 採用接口和實現分離的方式,它有個接口層,用戶記錄日誌的時候只需安裝 slf4j 的格式記錄日誌即可。

而系統真正寫入的日誌格式是依賴於實現層配置的內容的,如果你想真正記錄 log4j2 格式的日誌,則在實現層放入slf4j-log4j2.jar轉換文件,這樣就可以把用戶按照 slf4j 格式寫的日誌在項目中轉換成log4j2 格式的日誌了。

同理,如果用戶當前的項目是jcl格式的日誌,用戶想按照slf4j格式記錄日誌,那麼只需在放入一個橋接器:jcl-over-slf4j.jar橋接器,而原本這個項目是通過jcl輸出日誌的,現在卻會因為“jcl-over-slf4j.jar”橋接到slf4j中,而slf4j又會根據實現層綁定的具體日誌實現工具實現日誌輸出。

javaweb方向需要了解的系統日誌工具

slf4j 上層橋接和底層實現

上層和下層都可以相互轉換,就會出現一個問題,如果上層和下層使用了一個相互轉換的工具,那麼日誌的實現就會被踢來踢去,如下圖所示 ,紅色就是代表兩個會相互衝突,

javaweb方向需要了解的系統日誌工具

slf4j 橋階層和底層實現衝突

對於其他日誌格式的文件同樣可以適用以上兩張轉換關係,整個的轉換關係如下所示,紅色的線表示會相互踢皮球的。

javaweb方向需要了解的系統日誌工具

slf4j 所有橋接層和實現層衝突圖

下面就開始介紹主流的日誌工具的優缺點了:

LOG4j:

log4j 是apache的一個開源項目,創始人Ceki Gulcu。Log4j應該說是Java領域資格最老,應用最廣的日誌工具。從誕生之日到現在一直廣受業界歡迎。

Log4j是高度可配置的,並可通過在運行時的外部文件配置。它根據記錄的優先級別,並提供機制,以指示記錄信息到許多的目的地,諸如:數據庫,文件,控制檯,UNIX系統日誌等。

Log4j中有三個主要組成部分:loggers:負責捕獲記錄信息;appenders :負責發佈日誌信息,以不同的首選目的地;layouts:負責格式化不同風格的日誌信息。

JUL (java.util.logging)

JDK1.4開始,通過java.util.logging 提供日誌功能。它能滿足基本的日誌需要,但是功能沒有Log4j強大,而且使用範圍也沒有Log4j廣泛。

JCL( commons Loggin):

common-logging是apache的一個開源項目。也稱Jakarta Commons Logging,縮寫JCL。common-logging的功能是提供日誌功能的API接口,本身並不提供日誌的具體實現(當然,common-logging內部有一個Simple logger的簡單實現,但是功能很弱,直接忽略),而是在運行時動態的綁定日誌實現組件來工作(如log4j、java.util.loggin)。

SLF4J

SLF4J全稱為Simple Logging Facade for Java,而作者又是Ceki Gulcu!這位大神寫了Log4j、Logback和slf4j,專注日誌組件開發五百年,一直只能超越自己。

類似於Common-Logging,slf4j是對不同日誌框架提供的一個API封裝,可以在部署的時候不修改任何配置即可接入一種日誌實現方案。但是,slf4j在編譯時靜態綁定真正的Log庫。使用SLF4J時,如果你需要使用某一種日誌實現,那麼你必須選擇正確的SLF4J的jar包的集合(各種橋接包)。

javaweb方向需要了解的系統日誌工具

slf4j 所有橋接層和實現層衝突圖

common-logging vs slf4j

slf4j庫類似於Apache Common-Logging。但是,他在編譯時靜態綁定真正的日誌庫。這點似乎很麻煩,其實也不過是導入橋接jar包而已。

slf4j一大亮點是提供了更方便的日誌記錄方式:不需要使用logger.isDebugEnabled()來解決日誌因為字符拼接產生的性能問題。slf4j的方式是使用{}作為字符串替換符,形式如下:logger.debug("id: {},name: {} ",id,name).

logback:

Logback 是由log4j創始人Ceki Gulcu設計的又一個開源日記組件,目標是替代log4j。logback當前分成三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。

logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日記系統如log4j或JDK14 Logging。

logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日記的功能。

Log4j vs Logback

Logback相比Log4j具有許多好處:性能提高了近10倍、內存開銷減少了、logback應該更加穩定、天然支持slf4j、因為Logback-classic完全實現了slf4j的接口,天然支持slf4j、自動重載配置文件、通過配置文件最大數和過期時間,Logback可以控制日誌文件數並自動清除過期的日誌。

Logback-access:Logback-access支持Logback-classic的所有特性,並且它可以提供豐富的HTTP-access日誌功能。

log4j 2

log4j2 是log4j 的升級版 ,兼容log4j,相對的升級了:

api分離:將接口實現分離,性能相對於log4j1提升了18倍,log4j2支持種日誌的api:Log4j 1.2、 SLF4J、Commons Logging 、 java.util.logging (JUL) APIs;可以自動讀取配置等等優點。

現在比較推薦的是slf4j+Logback的解決方案。

瞭解主流的日誌工具後,我們還需要學習日誌中記錄信息的級別,在這些主流的日誌工具中,都把日誌根據信息的不同分為了幾個級別,不同的日誌工具可能分的不一樣,但都是大同小異的,清楚了一個之後其他都類似。這裡就以logback為例吧(本來想找slf4j的不知道怎麼就是打不開官網):logback中關於log level的介紹

實現log level的方法主要在logger、Appender和Layout這三個class文件中,Loger class是logback-classic的module,而Appender和Layout的接口是logback-core的一部分。logger接口提供的方法有 如下所示:

package org.slf4j;public interface Logger { // Printing methods: public void trace(String message); public void debug(String message); public void info(String message); public void warn(String message); public void error(String message);}

logback中設定的級別為:TRACE < DEBUG < INFO < WARN < ERROR. 級別設定的文件在:ch.qos.logback.classic.Level 類文件中。使用方法前應該先生成日誌類對象:

Logger logger = LoggerFactory.getLogger(類名.class);

其中getLogger填寫一個字符串即可,建議直接填寫: 類名.class,這樣可以直接使用當前類作為日誌表示,使用"類名.class"的字符串格式是:“com.hhxk.xrims.web.user.類名”, 我們都知道對於目錄 X 和目錄X.Y,X是Y的父級目錄,如果Y中的類名沒有申明日誌級別,則默認繼承父類X的日誌級別,例如下圖中的日誌級別,其中X.Y沒有設定日誌級別就 默認繼承了父級的日誌級別。

javaweb方向需要了解的系統日誌工具


分享到:


相關文章: