Ceki Gülcü創造了日志領域界著名的Log4J,現在又實現一個“簡單的日志前端接口(Façade)”- SLF4J,和一個“可靠、通用、快速而又靈活的Java日志框架”- LOGBack。作為日志領域中的新秀,已經有種顛覆領域的趨勢了。

SLF4J(Simple Logging Facade for Java)作為commons-logging的替代,為各種logging APIs提供了一個簡單的統一接口,使得最終用戶能夠在部署的時候配置所希望的logging APIs的實現。

SLF4J會根據classpath中所存在的適配器的jar來決定將使用的日志實現庫。

若需要將使用了其它logging APIs的第三方類庫或已有代碼的日志調用遷移到SLF4J,需要替換下面的jar:

  • jcl-over-slf4j.jar
    替換apache commons logging。
  • log4j-over-slf4j.jar
    替換log4j。原有的log4j.properites將失效,需要轉換為logback.xml,logback網站上有提供轉換器:http://logback.qos.ch/translator/
  • jul-to-slf4j.jar
    替換jdk logging。需要在程序開始時調用SLF4JBridgeHandler.install()來注冊listener。

SLF4J支持參數化的log字符串,避免了之前為了減少字符串拼接的性能損耗而不得不寫的if(logger.isDebugEnable()),現在你可以直接寫:logger.debug(“current user is: {}”, user)。拼裝消息被推遲到了它能夠確定是不是要顯示這條消息的時候,但是獲取參數的代價并沒有幸免。同時,日志中的參數若超過三個,則需要將參數以數組的形式傳入,如:

Object[] params = {value1, value2, value3};
logger.debug(“first value: {}, second value: {} and third value: {}.”, params);

現在Hibernate、Jetty、Spring-OSGi、Wicket和MINA等項目都已經遷移到了SLF4J,由此可見SLF4J的影響力不可忽視。

LogBack將作為Log4j的替代,和slf4j組成新的日志系統的完整實現。LogBack分為三個模塊:logback-core、logback-classic和logback-access。logback-core是其它兩個模塊的基礎;logback-classic是log4j的一個改良版本; logback-access與Servlet容器集成提供通過Http來訪問日志的功能。

LogBack聲稱具有極佳的性能:

“某些關鍵操作,比如判定是否記錄一條日志語句的操作,其性能得到了顯著的提高。這個操作在LogBack中需要3納秒,而在Log4J中則需要30納秒。LogBack創建記錄器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它獲取已存在的記錄器只需94納秒,而Log4J需要2234納秒,時間減少到了1/23。跟JUL相比的性能提高也是顯著的”。

對于一般的系統,個人感覺遷移到SLF4J的必要性不是很大,如果是開發公用類庫的話,就很有必要了,而且SLF4J解決了classloader的問題也是個很大的優勢。Log是導致程序性能下降的一個問題,LogBack的優化使性能有了很大的提升,如果你的程序遇到了瓶頸,需要全面進行優化的時候,LogBack不失為一個好的選擇。是否需要遷移,可從多方面進行考量,參考:《十個轉移到logback的理由》。