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實現的過程
一、項目中照常使用
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
編寫日誌。
二、仍然在src下使用log4j.properties文件進行配置。
三、使用的全部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的配置 java
<?xml version="1.0" encoding="UTF-8"?> <configuration> <substitutionProperty name="log.base" value="../logs/hzg" /> <jmxConfigurator /> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </layout> </appender> <!-- 文件輸出日誌 (文件大小策略進行文件輸出,超過指定大小對文件備份)--> <appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <Encoding>UTF-8</Encoding> <File>${log.base}.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>2MB</MaxFileSize> </triggeringPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </layout> </appender> <!-- 須要記錄日誌的包 --> <logger name="org.springframework"> <level value="WARN" /> </logger> <logger name="org.hibernate"> <level value="WARN" /> </logger> <logger name="org.hibernate.SQL"> <level value="WARN" /> </logger> <logger name="org.hibernate.cache"> <level value="ERROR" /> </logger> <root> <level value="INFO" /> <appender-ref ref="stdout" /> <appender-ref ref="logfile" /> </root> </configuration>
使用slf4j+logback的優點:
支持按文件大小或基於時間的切分方式,可自定義命名模式
支持文件打包(觸發器方式)
支持OSGI環境
若是在單純的logging環境中,使用SLF4J意義不大。若是想在各類logger API中切換,SELF4J是理想選擇,另外在新的項目中,使用SLF4J+Logback是比較好的日誌框架選型。spring