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