LOGBack:Java日志的新進展
Ceki Gülcü在Java日志領域世界知名。他創(chuàng)造了Log4J,這個最早的Java日志框架即便在JRE內置日志功能的競爭下仍然非常流行。隨后他又著手實現(xiàn)SLF4J這個“簡單的日志前端接口(Façade)”來替代Jakarta Commons-Logging。
在過去的一年中,Ceki在從事他的新項目,LOGBack,一個“可靠、通用、快速而又靈活的Java日志框架”。自一年前發(fā)布0.1 alpha版以來,LOGBack已經(jīng)取得了長足的進步。1.0版即將發(fā)布,又有早期用戶的正面評價,我們也應該仔細看看LOGBack,到底適不適合我們的需要。
Xavier Hanin 談論了他使用LOGBack的經(jīng)驗:
我已經(jīng)用了LOGBack幾個月,我被它打動了。
文檔和支持都很完善,日志功能簡潔利落,性能表現(xiàn)也說得上風馳電掣,還有創(chuàng)新的Eclipse插件,我終于給勞苦功高的Log4J找到了接班人。
Rob Willams 補充說:
噢,還有,我們當初毅然決定采用LogBack。愛死它了。整個過渡過程一點麻煩都沒有,我們絕對喜歡它的新語法。
他所說的新語法讓LOGBack能夠處理許多復雜的日志語句,而不再需要事先檢查日志級別(logging level),同時性能上的影響微不足道。比如在Log4J里面,你可能會這樣寫:
if( logger.isDebugEnabled() ) {
logger.debug( "User with account " +
user.getAccount() + " failed authentication; " +
"supplied crypted password " + user.crypt(password) +
" does not match." );
}
等價的LOGBack語句如下:
logger.debug( "User with account {} failed authentication; " +
"supplied crypted password {} does not match.",
user.getAccount(), user.crypt(password) );
LOGBack把拼裝消息的代價推遲到它能夠確定是不是要顯示這條消息的時候。不過獲取參數(shù)的高昂代價并沒有被推遲支付,比如上例中的密碼加密。
LOGBack還聲稱自己性能更佳:
某些關鍵操作,比如判定是否記錄一條日志語句的操作,其性能得到了顯著的提高。這個操作在LOGBack中需要3納秒,而在Log4J中則需要30納秒。LOGBack創(chuàng)建記錄器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它獲取已存在的記錄器只需94納秒,而Log4J需要2234納秒,時間減少到了1/23。跟JUL相比的性能提高也是顯著的。
LOGBack還可以被集成,目前已經(jīng)有了一個Eclipse插件和一個JMX Configurator Bean。
InfoQ就LOGBack訪問了Ceki,第一個問題是大家都關心的:為什么要建立另一個日志框架,而不是把這些改進放到Log4J中去?
我當時(今天也還部分地)覺得在Apache Logging Services項目之外做創(chuàng)新會容易一些。不要誤會我的意思,我對Apache Software Foundation的評價很高,它是一個獨特的,而且在很多方面都極其出色的組織。誰也說不定,可能有一天SLF4J和LOGBack成為日志領域新的事實標準的時候,會重新融入Apache。
關于SLF4J的接受程度:
現(xiàn)在有幾個重量級項目,比如Hibernate、Jetty、Spring-OSGi和Wicket都已經(jīng)遷移到了SLF4J API,我可以毫不慚愧地說,SLF4J的吸引力不可忽視。SLF4J正在四處冒出頭來,雖然Jakarta Commons Logging(JCL)這個廣泛使用的類庫,在Apache品牌的溫暖陽光沐浴下,占據(jù)著整個疆域。考慮到開始時的劣勢,SLF4J現(xiàn)在的表現(xiàn)已經(jīng)超過了我們的預期。
當被問到如何比較LOGBack的免費文檔,和Log4J那種小部分免費大部分商業(yè)的文檔時:
如你所說,Log4J只提供了有限的免費文檔,完善的文檔則需要付費。對于LOGBack,我們采納了另一種途徑,我們所有的文檔都可以在我們的項目網(wǎng)站上直接看到,獲取也完全免費,這給了Java開發(fā)者們又一個理由轉移到LOGBack。另外,LOGBack的市場占有率比Log4J要低一個數(shù)量級,銷售LOGBack的文檔沒有任何經(jīng)濟上的意義。
為了保證項目的長期經(jīng)濟支持,我們開發(fā)了一個跟LOGBack稍稍相關的產品,過幾周就會推出。我們對LOGBack的長期計劃是不搞任何噱頭,把它發(fā)展成一個合作性的開源項目。至于“合作性”,我的意思是開方給所有開發(fā)者作貢獻,而不局限于現(xiàn)在的開發(fā)團隊。
請說說離1.0版發(fā)布還差些什么:
對于即將到來的1.0版,大部分重要的東西都已經(jīng)齊備了。我們還要修復很多錯誤,但主要的工作還是完善文檔,做更多的測試,一再重復做這些事情。我說過要完善文檔沒?
在日志這個領域還有很多東西需要我們去做,可能要好幾代人才能完成。我們已經(jīng)逐漸看清了前面的路途,希望能夠給未來鋪平一些道路。
當被問到LOGBack有哪些能夠吸引開發(fā)者的地方:
沒有絕對的答案。有些用戶可能會覺得性能是一個值得轉移到LOGBack的理由,其他人可能覺得Log4J已經(jīng)不錯。雖然我和其他LOGBack開發(fā)者們正努力給用戶更多的理由,不過我們中間很多人對于能夠從事一個強調質量的軟件項目已經(jīng)很滿意。我們必須“吃我們自己的狗食”,并在這個過程中得到有價值的軟件開發(fā)技能——按今天的標準來說并不壞。考慮到LOGBack項目的出發(fā)點正是Log4J項目的不及之處,只要我們持續(xù)不斷地改進LOGBack,我們相信一定會有越來越多的Java開發(fā)者接受SLF4J/LOGBack的組合。
因為SLF4J和LOGBack可以橋接其他競爭性的API,開發(fā)者們可以在他們的項目中用LOGBack替換Log4J(通過log4j-bridge.jar)和Jakarta Commons-Logging(通過jcl104-over-slf4j.jar),因而不必僅僅為了使用LOGBack而被迫在同一個項目中配置好幾個日志框架。
關于LOGBack和SLF4J的更多信息請閱讀Ceki的 <十個轉移到LOGBack的理由>。