Log4j、Log4j 2、Logback、SFL4J、JUL、JCL的比較


Log4j、Log4j 2、Logback、SFL4J、JUL、JCL的比較

 之前就知道有好幾種日志框架,但是一直都是聽別人講,在什么時候該用何種logger,哪種logger比較好……一直對Log4j、Jakarta Commons-Logging、java.util.logging、SLF4J、Logback它們之間的區別已經各自的優勢不是很了解,這個周末決定沉下心來好好研究一下。一下這篇文章,就是我在對比了這幾種日志框架之后的一些收獲,希望能給大家帶來一點收獲。

 

  • Log4j

     Log4j = Log for Java.
     author: Ceki Gülcü
     license: Apache License V2.0
     Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制台、文件、數據庫等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。
     Log4j有7種不同的log級別,按照等級從低到高依次為:TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF。如果配置為OFF級別,表示關閉log。    
     Log4j支持兩種格式的配置文件:properties和xml。包含三個主要的組件:Logger、appender、Layout。    
Example for log4j 1.2     

復制代碼
<?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這片博客中解釋的非常清楚。在這里感謝一下原作者(^_^)。

  • JUL

     JUL = java.util.logging.

     Java提供了自己的日志框架,類似於Log4J,但是API並不完善,對開發者不是很友好,而且對於日志的級別分類也不是很清晰,比如:SEVEREWARNINGINFOCONFIGFINE,FINERFINEST。所以不推薦使用這種方式輸出日志。
JCL
     JCL = Jakarta Commons-Logging.
     Jakarta Commons Logging和SLF4J非常類似,也是提供的一套API來掩蓋了真正的Logger實現。便於不同的Logger的實現的替換,而不需要重新編譯代碼。缺點在於它的查找Logger的實現者的算法比較復雜,而且當出現了一些class loader之類的異常時,無法去修復它。

  • Log4j 2

     已經有很多其他的日志框架對Log4j進行了改良,比如說SLF4J、Logback等。而且Log4j 2在各個方面都與Logback非常相似,那么為什么我們還需要Log4j 2呢?
  1. 插件式結構。Log4j 2支持插件式結構。我們可以根據自己的需要自行擴展Log4j 2. 我們可以實現自己的appender、logger、filter。
  2. 配置文件優化。在配置文件中可以引用屬性,還可以直接替代或傳遞到組件。而且支持json格式的配置文件。不像其他的日志框架,它在重新配置的時候不會丟失之前的日志文件。
  3. Java 5的並發性。Log4j 2利用Java 5中的並發特性支持,盡可能地執行最低層次的加鎖。解決了在log4j 1.x中存留的死鎖的問題。如果你的程序仍然在飽受內存泄露的折磨,請毫不猶豫地試一下log4j 2吧。
  4. 異步logger。Log4j 2是基於LMAX Disruptor庫的。在多線程的場景下,和已有的日志框架相比,異步的logger擁有10左右的效率提升。
     還有更多的新特性,在這里就不一一贅述了。了解更多請移步到:http://logging.apache.org/log4j/2.x/manual/index.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM