天天看點

日志架構6:logback相較于log4j的優勢

無論從設計上還是實作上,Logback相對log4j而言有了相對多的改進。不過盡管難以一一細數,這裡還是列舉部分理由為什麼選擇logback而不是log4j。牢記logback與log4j在概念上面是很相似的,它們都是有同一群開發者建立。是以如果你已經對log4j很熟悉,你也可以很快上手logback。如果你喜歡使用log4j,你也許會迷上使用logback。

1.更快的執行速度

基于我們先前在log4j上的工作,logback 重寫了内部的實作,在某些特定的場景上面,甚至可以比之前的速度快上10倍。在保證logback的元件更加快速的同時,同時所需的記憶體更加少。

2.充分的測試

Logback 曆經了幾年,數不清小時數的測試。盡管log4j也是測試過的,但是Logback的測試更加充分,跟log4j不在同一個級别。我們認為,這正是人們選擇Logback而不是log4j的最重要的原因。人們都希望即使在惡劣的條件下,你的日記架構依然穩定而可靠。

3.logback-classic 非常自然的實作了SLF4J

logback-classic中的登陸類自然的實作了SLF4J。當你使用 logback-classic作為底層實作時,涉及到LF4J日記系統的問題你完全不需要考慮。更進一步來說,由于 logback-classic強烈建議使用SLF4J作為用戶端日記系統實作,如果需要切換到log4j或者其他,你隻需要替換一個jar包即可,不需要去改變那些通過SLF4J API 實作的代碼。這可以大大減少更換日記系統的工作量。

4.使用XML配置檔案或者Groovy

配置logback的傳統方法是通過XML檔案。在文檔中,大部分例子都是是用XML文法。但是,對于logback版本0.9.22,通過Groovy編寫的配置檔案也得到支援。相比于XML,Groovy風格的配置檔案更加直覺,連貫和簡短的文法。現在,已經有一個工具自動把logback.xml檔案遷移至logback.groovy。

5.自動重新載入配置檔案

Logback-classic可以在配置檔案被修改後,自動重新載入。這個掃描過程很快,無資源争用,并且可以動态擴充支援在上百個線程之間每秒上百萬個調用。它和應用伺服器結合良好,并且在J2EE環境通用,因為它不會調用建立一個單獨的線程來做掃描。

6.優雅地從I/O錯誤中恢複

FileAppender和它的子類,包括RollingFileAppender,可以優雅的從I/O錯誤中恢複。是以,如果一個檔案伺服器臨時當機,你再也不需要重新開機你的應用,而日志功能就能正常工作。當檔案伺服器恢複工作,logback相關的appender就會透明地和快速的從上一個錯誤中恢複。

7.自動清除舊的日志歸檔檔案

通過設定TimeBasedRollingPolicy 或者 SizeAndTimeBasedFNATP的 maxHistory 屬性,你就可以控制日志歸檔檔案的最大數量。如果你的復原政策是每月復原的,并且你希望儲存一年的日志,那麼隻需簡單的設定maxHistory屬性為12。對于12個月之前的歸檔日志檔案将被自動清除。

8.自動壓縮歸檔日志檔案

RollingFileAppender可以在復原操作中,自動壓縮歸檔日志檔案。壓縮通常是異步執行的,是以即使是很大的日志檔案,你的應用都不會是以而被阻塞。

9.謹慎模式

在謹慎模式中,在多個JVM中運作的多個FileAppender執行個體,可以安全的寫入統一個日志檔案。謹慎模式可以在一定的限制條件下應用于RollingFileAppender。

10.Lilith

Lilith是logback的一個記錄和通路事件檢視器。它相當于log4j的 chainsaw,但是Lilith設計的目的是處理大量的日志記錄。

11.配置檔案中的條件處理

開發者通常需要在不同的目标環境中變換logback的配置檔案,例如開發環境,測試環境和生産環境。這些配置檔案大體是一樣的,除了某部分會有不同。為了避免重複,logback支援配置檔案中的條件處理,隻需使用,和,那麼同一個配置檔案就可以在不同的環境中使用了。

12.過濾

Logback擁有遠比log4j更豐富的過濾能力。例如,讓我們假設,有一個相當重要的商業應用部署在生産環境。考慮到大量的交易資料需要處理,記錄級别被設定為WARN,那麼隻有警告和錯誤資訊才會被記錄。現在,想象一下,你在開發環境遇到了一個臭蟲,但是在測試平台中卻很難發現,因為一些環境之間(生産環境/測試環境)的未知差異。

使用log4j,你隻能選擇在生産系統中降低記錄的級别到DEBUG,來嘗試發現問題。但是很不幸,這會生成大量的日志記錄,讓分析變得困難。更重要的是,多餘的日志記錄會影響到生産環境的性能。

使用logback,你可以選擇保留隻所有使用者的WARN級别的日志,而除了某個使用者,例如Alice,而她就是問題的相關使用者。當Alice登入系統,她就會以DEBUG級别被記錄,而其他使用者仍然是以WARN級别來記錄日志。這個功能,可以通過在配置檔案的XML中添加4行。

13.SiftingAppender

SiftingAppender是一個全能的追加器。它可以基于任何給定的實時屬性分開(或者篩選)日志。例如,SiftingAppender可以基于使用者會話分開日志事件,這樣,可以為每一個使用者建立一個獨立的日志檔案。

14.堆棧軌迹資訊包含包的資料

當logback列印一個異常,堆棧軌迹資訊将包含包的相關資料。下面是一個通過 logback-demo 生成的堆棧資訊:

14:28:48.835 [btpool0-7] INFO  c.q.l.demo.prime.PrimeAction - 99 is not a valid value
java.lang.Exception: 99 is invalid
  at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
  at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
  at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
  at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
  at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
  at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
  at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]
           

從上面的資訊,你可以發現這個應用使用Struts 1.2.9 而且是使用 jetty 6.1.12部署的。是以,堆棧軌迹資訊将快速的告訴讀者,關于異常發生的類還有包和包的版本。當你的客戶發送一個堆棧軌迹資訊給你,作為一個開發人員,你就不需要讓他們告訴你他們正在使用的包的版本。這項資訊已經包括在堆棧軌迹資訊中。詳細請參考 “%xThrowable” conversion word.

15.Logback-access子產品,提供了通過HTTP通路日志的能力,是logback不可或缺的組成部分

最後但絕非最不重要的是,作為logback釋出包的一部分,logback-access子產品可與Jetty或者Tomcat進行內建,提供了非常豐富而強大的通過HTTP通路日志的功能。因為logback-access子產品是logback初期設計方案中的一部分,是以,所有你所喜歡的logback-classic子產品所提供的全部特性logback-access同樣也具備。