java的幾個日誌框架log4j、logback、common-logging

開發工作中每個系統都需要記錄日誌,常見的日誌工具有log4j(用的最多),slf4j,commons-loging,以及最近比較流行的logback

以前只是在項目中用log4j,更多的是參考下配置文檔,沒有對日誌系統做過系統的學習,這裏簡單列一下各種日誌框架的優缺點

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來訪問日記的功能。

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無法工作。

由於log4j比較主流,今天主要講一下從log4j切換到logback
log4j切換到logback的步驟: 1.將logback-classic和logback-core的jar包引入到工程,將有關log4j的jar包從工程的classpath中移除。 2.確認工程引入了slf4j的jar包,作爲日誌的適配。 3.在工程中新建logback.xml文件,利用轉換工具(地址:http://logback.qos.ch/translator/),將原來log4j配置文件(log4j.properties)的內容拷貝到轉換工具中,轉換爲logback的對應配置,然後將轉換後的內容存入logback.xml。
4.完成上述轉換後,因爲參數含義不同,要修改一些細微的地方:

配置內容

logback

log4j

%c{}

{0}打印類名,例:MyLog

{n}打印類名和包名的首字母,例:c.b.u.MyLog

{0}打印全路徑類名,例:com.bs3.utils.MyLog

{1}打印類名,例:MyLog

{2}打印類名和上一層包名,例;utils.MyLog

{n}依此類推

日誌文件名稱樣式

<File>log/rpt.log</File>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<fileNamePattern>log/rpt.log.%d{yyyyMMddHH}</fileNamePattern>

</rollingPolicy>

<!-- 去掉了'.'-->

log4j.appender.RPT.File = log/rpt.log

log4j.appender.RPT.DatePattern ='.'yyyyMMdd

配置內容
logback

log4j

%c{}

{0}打印類名,例:MyLog

{n}打印類名和包名的首字母,例:c.b.u.MyLog

{0}打印全路徑類名,例:com.bs3.utils.MyLog

{1}打印類名,例:MyLog

{2}打印類名和上一層包名,例;utils.MyLog

{n}依此類推

日誌文件名稱樣式

<File>log/rpt.log</File>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<fileNamePattern>log/rpt.log.%d{yyyyMMddHH}</fileNamePattern>

</rollingPolicy>

<!-- 去掉了'.' -->

log4j.appender.RPT.File        = log/rpt.log

log4j.appender.RPT.DatePattern    ='.'yyyyMMdd

5.將工程中,由於缺失了log4j.jar引起的錯誤進行修正,改爲利用logback實現。

 

可能遇到的問題及解決方案:

1.Log4j轉換到logback後,運行後spring的日誌都以紅字輸出到控制檯,而不受logback控制。

因爲Spring的日誌默認採用commons-logging,解決方法是在工程中引入jcl-over-slf4j-1.6.1.jar,這樣就將commons-logging與slf4j對接,再通過logback進行了日誌的統一輸出。

2.切換完成後,啓動工程時會出現java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory這個錯誤。

原因是slf4j-api的jar包版本太低,改爲slf4j-api-1.6.4.jar即可解決。

maven倉庫地址:http://mvnrepository.com
 
發佈了46 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章