1. 程式人生 > >【Java】日誌知識總結和經常使用組合配置(commons-logging,log4j,slf4j,logback)

【Java】日誌知識總結和經常使用組合配置(commons-logging,log4j,slf4j,logback)

ng- binder mono leading black auto erb param 1.2

技術分享


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的影響力不可忽視。


一、SLF4J 的幾種實際應用模式--之中的一個:SLF4J+Log4J

SLF4J(Simple Logging Facade for Java) 是一個通用的日誌框架。不能何以謂之 Facade(門面)。所扮眼的角色相當於 Jakarta Commons Logging。

就像 JCL 須要底層的日誌實現,如 Log4J、java.util.logging、Simple Logger 等來完畢詳細的信息輸出。其實基本總是 JCL+Log4J 那麽一個絕配。SLF4J 的原旨也是能支持多種下層日誌框架實現,但最好的日誌實現仍然是 Log4J,所以本篇講述 SLF4J 的第一種使用方法 SLF4J+Log4J。

須要的配置文件和組件包,以下三個 jar 文件和一個 properties 文件都是要放在項目的 ClassPath 上。

1. slf4j-api-1.7.7.jar
2. slf4j-log4j12-1.7.7.jar
3. log4j-1.2.17.jar
4. log4j.properties(也能夠是 log4j.xml,本例中用 log4j.propertes)


maven:

pom.xml

<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.7</version>
		</dependency>
		
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.7</version>
		</dependency>


前兩個包在 http://www.slf4j.org/download.html 處下載,後一個包在http://logging.apache.org/log4j/1.2/download.html 下載,可能包文件名稱中的版本有些差,不要緊。

log4j.properties 曾經該是怎麽寫,如今還是怎麽寫,比方一個最簡單的內容,僅僅向控制臺輸出日誌信息,例如以下:

[xml] view plaincopy
  1. log4j.rootLogger=DEBUG,console
  2. log4j.appender.console=org.apache.log4j.ConsoleAppender
  3. log4j.appender.console.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

log4j.xml文件:

<?xml version="1.0" encoding="UTF-8" ?

> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p %C(%F:%L) - %m%n" /> </layout> </appender> <appender name="DEBUG" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="/var/log/w3pc/debug.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="5120KB" /> <param name="MaxBackupIndex" value="7" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p %C(%F:%L) - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="DEBUG" /> </filter> </appender> <appender name="INFO" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="/var/log/w3pc/info.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="5120KB" /> <param name="MaxBackupIndex" value="7" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p %C(%F:%L) - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> </appender> <appender name="WARN" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="/var/log/w3pc/warn.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="5120KB" /> <param name="MaxBackupIndex" value="7" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p %C(%F:%L) - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="WARN" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <appender name="ERROR" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="/var/log/w3pc/error.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="5120KB" /> <param name="MaxBackupIndex" value="7" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p %C(%F:%L) - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="ERROR" /> </filter> </appender> <root> <priority value="INFO" /> <appender-ref ref="INFO"/> <appender-ref ref="WARN"/> <appender-ref ref="DEBUG"/> <appender-ref ref="ERROR"/> <appender-ref ref="STDOUT"/> </root> </log4j:configuration>



二、 SLF4J 的幾種實際應用模式--之中的一個:SLF4J+Logback

前面講的 SLF4J 的使用方法之中的一個是 SLF4J+Log4J,而這裏要推出的組合是 SLF4J+LogBack。不用 Log4J?難道還有比 Log4J 更好的日誌實現嗎?是的,答案就是LogBack。假如你知道 LogBack 和 Log4J 是同出一位大師之手,你就不會認為吃驚了。

LogBack 對 Log4J 進行了增強,並投入了 SLF4J 的懷抱。它還被作者認定為 Log4J 的繼任者。

為什麽叫做 Logback,我就不知道了,反正不要叫做 Brokeback 即可。這裏是推崇用 Logback 替代 Log4J 的十幾個理由:Reasons to prefer logback over log4j。說的大至是更快。好測試。與 SLF4J 關系緊;文檔豐富。能自己主動載入配置文件。多個 JVM 寫一個日誌文件,或其它 I/O 錯誤時不影響程序運行;配置文件裏增加條件控制;強大的日誌過濾;更強的日誌切分功能;自己主動壓縮、刪除日誌文件;異常棧中很多其它的數據信息。

Logback 分為三個模塊:logback-core,logback-classic,logback-access。logback-core 是核心。logback-classic 改善了 log4j,且自身實現了 SLF4J API。所以即使用 Logback 你仍然能夠使用其它的日誌實現,如原始的 Log4J,java.util.logging 等;logback-access 讓你方便的訪問日誌信息。如通過 http 的方式。

還得提一點。Logback 能更好的放到 OSGI 環境中。好了,簡單紹完了 Logback,就來看看詳細怎麽用它。

須要的配置文件和組件包,以下三個 jar 文件和一個 xml文件都是要放在項目的 ClassPath 上。

1. slf4j-api-1.5.11.jar
2. logback-core-0.9.20.jar
3. logback-classic-0.9.20.jar
4. logback.xml 或 logback-test.xml (類似於 log4j.properties/log4j.xml)


三、SLF4J如何定位到詳細用哪個log

在應用中,通過LoggerFactory類的靜態getLogger()獲取logger。通過查看該類的代碼能夠看出,終於是通過StaticLoggerBinder.SINGLETON.getLoggerFactory()方法獲取LoggerFactory然後,在通過該詳細的LoggerFactory來獲取logger的。類org.slf4j.impl.StaticLoggerBinder並不在slf4j-api-1.5.2.jar包中。細致查看每一個與詳細日誌系統相應的jar包,就會發現,相應的jar包都有一個org.slf4j.impl.StaticLoggerBinder的實現,不同的實現返回與該日誌系統相應的LoggerFactory,因此就實現了所謂的靜態綁定,達到僅僅要選取不同jar包就能簡單靈活配置的目的。


【Java】日誌知識總結和經常使用組合配置(commons-logging,log4j,slf4j,logback)