1. 程式人生 > >Log4j、Logback、slf4j比較

Log4j、Logback、slf4j比較

Log4j
Log4j = Log for Java.
author: Ceki Gülcü
license: Apache License V2.0
Log4j是Apache的一個開放原始碼專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、資料庫等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。
Log4j有7種不同的log級別,按照等級從低到高依次為:TRACE

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>   <!--an appender is an output destination, such as the console or a file; names of appenders are arbitrarily chosen-->   <appender name="stdout" class="org.apache.log4j.ConsoleAppender">     <layout class="org.apache.log4j.PatternLayout">       <param
name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
    </layout>   </appender>   <!--loggers of category 'org.springframework' will only log messages of level "info" or higher; if you retrieve Loggers by using the class name (e.g. Logger.getLogger(AClass.class)) and if AClass is part of the org.springframework package, it will belong to this category-->
  <logger name="org.springframework">     <level value="info"/>   </logger>   <!--everything of spring was set to "info" but for class PropertyEditorRegistrySupport we want "debug" logging-->   <logger name="org.springframework.beans.PropertyEditorRegistrySupport">     <level value="debug"/>   </logger>      <root>   <!--all log messages of level "debug" or higher will be logged, unless defined otherwise all log messages will be logged to the appender "stdout", unless defined otherwise-->     <level value="debug" />     <appender-ref ref="stdout" />   </root> </log4j:configuration>

SLF4J
SLF4J = Simple Logging Facade for Java.
author: Ceki Gülcü
SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,而是通過Facade Pattern提供一些Java logging API,它只服務於各種各樣的日誌系統。按照官方的說法,SLF4J是一個用於日誌系統的簡單Facade,允許終端使用者在部署其應用時使用其所希望的日誌系統。作者建立SLF4J的目的是為了替代Jakarta Commons-Logging。
實際上,SLF4J所提供的核心API是一些介面以及一個LoggerFactory的工廠類。在使用SLF4J的時候,不需要在程式碼中或配置檔案中指定你打算使用那個具體的日誌系統。SLF4J提供了統一的記錄日誌的介面,只要按照其提供的方法記錄即可,最終日誌的格式、記錄級別、輸出方式等通過具體日誌系統的配置來實現,因此可以在應用中靈活切換日誌系統。
那麼什麼時候使用SLF4J比較合適呢?
如果你開發的是類庫或者嵌入式元件,那麼就應該考慮採用SLF4J,因為不可能影響終端使用者選擇哪種日誌系統。在另一方面,如果是一個簡單或者獨立的應用,確定只有一種日誌系統,那麼就沒有使用SLF4J的必要。假設你打算將你使用log4j的產品賣給要求使用JDK 1.4 Logging的使用者時,面對成千上萬的log4j呼叫的修改,相信這絕對不是一件輕鬆的事情。但是如果開始便使用SLF4J,那麼這種轉換將是非常輕鬆的事情。

Logback
author: Ceki Gülcü
licences:EPL v1.0 and LGPL 2.1
Logback,一個“可靠、通用、快速而又靈活的Java日誌框架”。logback當前分成三個模組:logback-core,logback- classic和logback-access。logback-core是其它兩個模組的基礎模組。logback-classic是log4j的一個改良版本。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日誌系統如log4j或JDK14 Logging。logback-access訪問模組與Servlet容器整合提供通過Http來訪問日誌的功能。

 1. logback-core: Joran, Status, context, pattern parsing
 2. logback-classic: developer logging
 3. logback-access: The log generated when a user accesses a web-page on a web server. Integrates seamlessly with Jetty and Tomcat.

選擇logback的理由:(http://logback.qos.ch/reasonsToSwitch.html#fasterImpl
1. logback比log4j要快大約10倍,而且消耗更少的記憶體。
2. logback-classic模組直接實現了SLF4J的介面,所以我們遷移到logback幾乎是零開銷的。
3. logback不僅支援xml格式的配置檔案,還支援groovy格式的配置檔案。相比之下,Groovy風格的配置檔案更加直觀,簡潔。
4. logback-classic能夠檢測到配置檔案的更新,並且自動重新載入配置檔案。
5. logback能夠優雅的從I/O異常中恢復,從而我們不用重新啟動應用程式來恢復logger。
6. logback能夠根據配置檔案中設定的上限值,自動刪除舊的日誌檔案。
7. logback能夠自動壓縮日誌檔案。
8. logback能夠在配置檔案中加入條件判斷(if-then-else)。可以避免不同的開發環境(dev、test、uat…)的配置檔案的重複。
9. logback帶來更多的filter。
10. logback的stack trace中會包含詳細的包資訊。
11. logback-access和Jetty、Tomcat整合提供了功能強大的HTTP-access日誌。
配置檔案:需要在專案的src目錄下建立一個logback.xml。注:(1)logback首先會試著查詢logback.groovy檔案;(2)當沒有找到時,繼續試著查詢logback-test.xml檔案;(3)當沒有找到時,繼續試著查詢logback.xml檔案;(4)如果仍然沒有找到,則使用預設配置(列印到控制檯)。 詳細的配置在http://aub.iteye.com/blog/1101222這篇部落格中解釋的非常清楚。在這裡感謝一下原作者(^_^)。