Java日誌框架:SLF4J, Apache Common-Logging, Log4J和Logback

原文鏈接:http://liuzidong.iteye.com/blog/776072

同時可參考另一篇:http://blog.csdn.net/kobejayandy/article/details/17335407  http://www.cnblogs.com/zhuawang/p/3999235.html

Log4j 

Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日誌信息輸送的目的地是控制檯、文件、GUI組件、甚至是套接口服務 器、NT的事件記錄器、UNIX Syslog守護進程等;用戶也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,用戶能夠更加細緻地控制日誌的生成過程。這些可以通過一個 配置文件來靈活地進行配置,而不需要修改程序代碼。 

LOGBack 

Logback是由log4j創始人設計的又一個開源日記組件。logback當前分成三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日記系統如log4j或JDK14 Logging。logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日記的功能。 

Log4J vs. LOGBack 

LOGBack作爲一個通用可靠、快速靈活的日誌框架,將作爲Log4j的替代和SLF4J組成新的日誌系統的完整實現。LOGBack聲稱具有極佳的性能,“ 某些關鍵操作,比如判定是否記錄一條日誌語句的操作,其性能得到了顯著的提高。這個操作在LogBack中需要3納秒,而在Log4J中則需要30納秒。 LogBack創建記錄器(logger)的速度也更快:13微秒,而在Log4J中需要23微秒。更重要的是,它獲取已存在的記錄器只需94納秒,而 Log4J需要2234納秒,時間減少到了1/23。跟JUL相比的性能提高也是顯著的”。 

另外,LOGBack的所有文檔是全面免費提供的,不象Log4J那樣只提供部分免費文檔而需要用戶去購買付費文檔。 

SLF4J 

簡單日記門面(Facade)SLF4J是爲各種loging APIs提供一個簡單統一的接口,從而使得最終用戶能夠在部署的時候配置自己希望的loging APIs實現。 Logging API實現既可以選擇直接實現SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通過SLF4J提供的API實現來開發相應的適配器如Log4jLoggerAdapter、JDK14LoggerAdapter。 

Apache Common-Logging 

目前廣泛使用的Java日誌門面庫。通過動態查找的機制,在程序運行時自動找出真正使用的日誌庫。但由於它使用了ClassLoader尋找和載入底層的日誌庫, 導致了象OSGI這樣的框架無法正常工作,由於其不同的插件使用自己的ClassLoader。 OSGI的這種機制保證了插件互相獨立,然而確使Apache Common-Logging無法工作。 

SLF4J vs. Apache Common-Logging 

SLF4J庫類似於Apache Common-Logging。但是,他在編譯時靜態綁定真正的Log庫。使用SLF4J時,如果你需要使用某一種日誌實現,那麼你必須選擇正確的SLF4J的jar包的集合。 如此便可以在OSGI中使用了。 
另外,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的影響力不可忽視。 

使用CommonLog接口而實際由SLF4J和Log4j實現的過程 

1、項目中照常使用 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
編寫日誌。 

2、仍然在src下使用log4j.properties文件進行配置。 

3、使用的所有jar文件: 
   1)log4j-1.2.15.jar 這是log4j的庫。 SLF4J並不改變這個底層實現庫。 
   2)slf4j-api-1.5.2.jar 這是SLF4J庫。 
   3)slf4j-log4j12-1.5.2.jar 這包含Log4j的適配器和靜態綁定log4j底層實現。 
   4)jcl-over-slf4j-1.5.2.jar 這提供了Commons-Logging接口,以及使用common-loggin的接口,底層還是由SLF4J來決定哪種實現機制 。 

這裏,我們需要使用Log4j的原生庫,但是不需要Commons-Logging的原生庫。 
一切就緒,把上面這4個jar包複製到lib下,導入項目中,就可以像以往一樣繼續使用Apache Common-Logging編寫日誌了。 

看一看logback.xml的配置 

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <configuration>  
  3.   <substitutionProperty name="log.base" value="../logs/hzg" />  
  4.   <jmxConfigurator />  
  5.   <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">  
  6.      <layout class="ch.qos.logback.classic.PatternLayout">  
  7.         <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>  
  8.      </layout>  
  9.     </appender>  
  10.     <!-- 文件輸出日誌 (文件大小策略進行文件輸出,超過指定大小對文件備份)-->  
  11.   
  12.    <appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  13.         <Encoding>UTF-8</Encoding>  
  14.         <File>${log.base}.log</File>  
  15.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  16.             <FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern>  
  17.         </rollingPolicy>  
  18.         <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">  
  19.             <MaxFileSize>2MB</MaxFileSize>  
  20.         </triggeringPolicy>  
  21.         <layout class="ch.qos.logback.classic.PatternLayout">  
  22.             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>  
  23.         </layout>  
  24.     </appender>   
  25.   
  26.     <!-- 需要記錄日誌的包 -->  
  27.     <logger name="org.springframework">  
  28.         <level value="WARN" />  
  29.     </logger>  
  30.     <logger name="org.hibernate">  
  31.         <level value="WARN" />  
  32.     </logger>  
  33.     <logger name="org.hibernate.SQL">  
  34.         <level value="WARN" />  
  35.     </logger>  
  36.         <logger name="org.hibernate.cache">  
  37.         <level value="ERROR" />  
  38.     </logger>  
  39.     <root>  
  40.         <level value="INFO" />  
  41.         <appender-ref ref="stdout" />  
  42.         <appender-ref ref="logfile" />  
  43.     </root>  
  44. </configuration>  


使用slf4j+logback的優勢: 

支持按文件大小或基於時間的切分方式,可自定義命名模式 
支持文件打包(觸發器方式) 
支持OSGI環境 
如果在單純的logging環境中,使用SLF4J意義不大。如果想在各種logger API中切換,SELF4J是理想選擇,另外在新的項目中,使用SLF4J+Logback是比較好的日誌框架選型。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章