1. 程式人生 > >Log4j、Log4j 2、JUL、JCL 、SFL4J 、Logback 與 Lombok 的使用

Log4j、Log4j 2、JUL、JCL 、SFL4J 、Logback 與 Lombok 的使用

Log4J

Log4j = Log for Java. Log4j是Apache的一個開放原始碼專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、資料庫等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。      Log4j有7種不同的log級別,按照等級從低到高依次為:TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF。如果配置為OFF級別,表示關閉log。    
     Log4j支援兩種格式的配置檔案:properties和xml。包含三個主要的元件:Logger、appender、Layout。

Log4J 2

基於Log4J的優化。

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左右的效率提升。

全面介紹詳見官方文件

配置方式:Log4J 2 日誌配置

JUL

JUL = java.util.logging.      Java提供了自己的日誌框架,類似於Log4J,但是API並不完善,對開發者不是很友好,而且對於日誌的級別分類也不是很清晰,比如:SEVERE, WARNING, INFO, CONFIG, FINE,FINER, FINEST。所以不推薦使用這種方式輸出日誌。

JCL - Apache Commons-logging

     JCL = Jakarta Commons-Logging.      Jakarta Commons Logging和SLF4J非常類似,也是提供的一套API來掩蓋了真正的Logger實現。便於不同的Logger的實現的替換,而不需要重新編譯程式碼。缺點在於它的查詢Logger的實現者的演算法比較複雜,而且當出現了一些class loader之類的異常時,無法去修復它。 common-logging元件:          Jakarta Commons Logging (JCL)提供的是一個日誌(Log)介面(interface),同時兼顧輕量級和不依賴於具體的日誌實現工具。它提供給中介軟體/日誌工具開發者一個簡單的日誌操作抽象,允許程式開發人員使用不同的具體日誌實現工具。瞭解包裡情況,可以檢視它的API文件: http://www.oschina.net/uploads/doc/commons-logging-1.1.1/index.html  , 其中Log(基本記錄器)和LogFactory(負責建立Log例項)是兩個基類。該API直接提供對下列底層日誌記錄工具的支援:Jdk14Logger,Log4JLogger,LogKitLogger,NoOpLogger (直接丟棄所有日誌資訊),還有一個SimpleLog。 有必要詳細說明一下呼叫LogFactory.getLog()時發生的事情。呼叫該函式會啟動一個發現過程,即找出必需的底層日誌記錄功能的實現,具體的發現過程在下面列出:   ( 換句話說就是, 有這麼多工具,common-logging該使用哪一個呢?這取決於系統的設定,common-logging將按以下順序決定使用哪個日誌記錄工具:)         (1).common-logging首先在CLASSPATH中查詢commons-logging.properties檔案。這個屬性檔案至少定義org.apache.commons.logging.Log屬性,它的值應該是上述任意Log介面實現的完整限定名稱。如果找到 org.apache.commons.logging.Log屬相,則使用該屬相對應的日誌元件。結束髮現過程。         (2).如果上面的步驟失敗(檔案不存在或屬相不存在),common-logging接著檢查系統屬性org.apache.commons.logging.Log。如果找到org.apache.commons.logging.Log系統屬性,則使用該系統屬性對應的日誌元件。結束髮現過程。         (3).如果找不到org.apache.commons.logging.Log系統屬性,common-logging接著在CLASSPATH中尋找log4j的類。如果找到了就假定應用要使用的是log4j。不過這時log4j本身的屬性仍要通過log4j.properties檔案正確配置。結束髮現過程。         (4).如果上述查詢均不能找到適當的Logging API,但應用程式正執行在JRE 1.4或更高版本上,則預設使用JRE 1.4的日誌記錄功能。結束髮現過程。         (5).最後,如果上述操作都失敗(JRE 版本也低於1.4),則應用將使用內建的SimpleLog。SimpleLog把所有日誌資訊直接輸出到System.err。結束髮現過程。         為了簡化配置 commons-logging ,一般不使用 commons-logging 的配置檔案,也不設定與 commons-logging 相關的系統環境變數,而只需將 Log4j 的 Jar 包放置到 classpash 中就可以了。這樣就很簡單地完成了 commons-logging 與 Log4j 的融合。         根據不同的性質,日誌資訊通常被分成不同的級別,從低到高依次是:“除錯( DEBUG )”“資訊( INFO )”“警告( WARN )”“錯誤(ERROR )”“致命錯誤( FATAL )”。

SLF4J

SLF4J = Simple Logging Facade for Java. 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

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比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)如果仍然沒有找到,則使用預設配置(列印到控制檯) LogBack 配置: http://aub.iteye.com/blog/1101222

Lombok

https://projectlombok.org/features/all @CommonsLog Creates  private static final  org.apache.commons.logging.Log  log =  org.apache.commons.logging.LogFactory.getLog (LogExample.class); @JBossLog Creates  private static final  org.jboss.logging.Logger  log =  org.jboss.logging.Logger.getLogger (LogExample.class); @Log Creates  private static final  java.util.logging.Logger  log =  java.util.logging.Logger.getLogger (LogExample.class.getName()); @Log4j Creates  private static final  org.apache.log4j.Logger  log =  org.apache.log4j.Logger.getLogger (LogExample.class); @Log4j2 Creates  private static final  org.apache.logging.log4j.Logger  log =  org.apache.logging.log4j.LogManager.getLogger (LogExample.class); @Slf4j Creates  private static final  org.slf4j.Logger  log =  org.slf4j.LoggerFactory.getLogger (LogExample.class); @XSlf4j Creates  private static final  org.slf4j.ext.XLogger  log =  org.slf4j.ext.XLoggerFactory.getXLogger (LogExample.class);