日 志,源于log,有航海日志的意思。指記錄海員記錄每天的行程,生活及發(fā)生的事件。在軟件開發(fā)領(lǐng)域,用來監(jiān)控代碼中變量變化,跟蹤 代碼運行的軌跡,在開發(fā)環(huán)境中擔(dān)當(dāng)調(diào)試器作用,向控制臺或文件輸出信息。
幾乎所有的軟件開發(fā)語言(平臺)都有自己的日志系統(tǒng),java,.net,ruby,php等。在java領(lǐng) 域,存在大量的日志組件,open-open收 錄了21個日志組件。
從 功能上講,這些可以分為三類,一是日志工具類,它實現(xiàn)了日志的記錄,格式化和級別的劃分,代表為 logback,simplelog。二是日志系統(tǒng),提供了完整的框架功能并實現(xiàn)了日志記錄。代表為jul(jdk提供的日志框 架),log4j(apache開源項目)。三是抽象整合類,它提供了一組接口,完成日志功能,通過包裝其他日志工具或系統(tǒng)來工作jcl(apache開 源組件),slf4j。
從歷史上講,log4j出現(xiàn)最早,Ceki Gülcü是其創(chuàng)造者。自java1.4開始,jdk提供了java.util.logging 類庫,提供了一個完整的日志框架,在設(shè)計上要比log4j要更清晰。 這個時候,除此之外,還有一些其他日志組件,java領(lǐng)域從來不缺少輪子,總是有人在發(fā)明輪 子,輪子多了,就會產(chǎn)生混亂,就會有人站出來,要一統(tǒng)江湖,于是,jcl,apache一個開源的日志組件誕生了,它提供了一組日志系統(tǒng)的接口,通過對 log4j,jul和simplelog進行包裝,提供日志功能。這樣,開發(fā)的時候,只需要使用jcl,通過配置,靈活選擇底層實現(xiàn)。這樣,對于開發(fā)人員 來說,開發(fā)更簡單了些。看起來一切太平了,可Ceki Gülcü認(rèn)為,應(yīng)該有一個更好的日志框架。log4j經(jīng)過這么久的發(fā)展,已經(jīng)成為了一個巨人,亦 傷痕累累,從外面看,經(jīng)典,莊重,強壯,從內(nèi)部看,卻有著一根根的飛線(ThinkPad),充滿了代碼的壞味道。或許他沒有勇氣來改造這個巨人,離開也 許是最好的選擇,于是,出來,創(chuàng)建了slf4j,來取代jcl,創(chuàng)建了logback,來取代log4j。目前,log4j和jul應(yīng)用最為廣 泛,slf4j作為新興的抽象層,整合logback,以其簡潔,快速,正被越來越多的頂級項目使用。
代表日志組件簡要介紹。
Log4j,歷史悠久,應(yīng)用廣泛,被移植到多種語言及平臺,功能強大,在眾多的日志框架 中,仍占據(jù)著主導(dǎo)地位。
Jul,jdk提供的日志框架,設(shè)計精良,和jdk緊密結(jié)合,控制靈活,使用簡單。
Jcl,提供了日志的抽象層,可以整合多種實現(xiàn)。但有classloader問題。
Slf4j,提供了jcl的超集,避免了classloader問題。
Logback,可靠,通用,快速,靈活的java日 志工具(官方描述)。
項目選擇思考。
如果是單一的項目,如桌面應(yīng)用,采 用jul,免配置,控制靈活。
如果是web開發(fā),宜采用 log4j,因為系統(tǒng)已經(jīng)有了很多的配置文件,不在乎多一個,而且log4j可以脫離任何組件,不像jul,和jvm緊密結(jié)合在一起。
如果是多項目整合開發(fā),宜采用 slf4j,一是它可以整合其他遺留日志組件,二是其提供的抽象層,為將來的開發(fā)提供了靈活性。
參考資料:
1.IBM developerworks對 log4j的介紹。 鏈接
2.Java開 源日志組件列表。鏈接
3.Slf4j官 方網(wǎng)站。鏈接
4.Logback官 方網(wǎng)站。鏈接
5.Log4j官 方網(wǎng)站。鏈接
6.Jcl官 方網(wǎng)站。鏈接
7.Sun官 方網(wǎng)站。鏈接
8.一 個jcl的中文說明。鏈接
天蒼蒼,野茫茫,風(fēng)吹草底見牛羊