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

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

SLF4J會根據(jù)classpath中所存在的適配器的jar來決定將使用的日志實(shí)現(xiàn)庫。

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

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

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

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

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

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

LogBack聲稱具有極佳的性能:

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

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