天天看點

log4j&slf4j日志架構入門

Log4j是什麼、有什麼

Log4j是Apache的一個開放源代碼項目,通過使用Log4j,可以控制日志資訊輸送的目的地是控制台、檔案、GUI元件、甚至是套接口伺服器、NT的事件記錄器等;也可以控制每一條日志的輸出格式;通過定義每一條日志資訊的級别,能夠更加細緻地控制日志的生成過程。這些可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的代碼。

一個開源的、輕量級的、用于日志管理的架構

 Log4j由三個重要的元件構成: 日志資訊的輸出格式,日志資訊的優先級, 日 志資訊的輸出目的地。日志資訊的優先級用來指定這條日志資訊的重要程度;日志資訊的輸出目的地指定了日志将列印到控制台還是檔案中;而輸出格式則控制了日志資訊的顯示内容 。

主要用來進行日志記錄的管理,包括對日志輸出的目的地,輸出的資訊級别和輸出的格式等。

Logger被指定為實體,Logger的名字是大小寫敏感的,它們遵循以下的命名文法規則:用“.”來劃分層次級别,如:cn.javass.test

OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。Log4j建議隻使用四個級别,優先級從高到低分别是ERROR、WARN、INFO、DEBUG。通過在這裡定義的級别,可以控制到應用程式中相應級别的日志資訊的開關。

1:級别的控制,就是隻要大于等于指定的控制級别,就可以輸出

2:如果有多個logger,都可以比對輸出,則每個logger都産生輸出,其中根logger比對所有的輸出;而級别控制來源于路徑最詳細的logger。

java代碼:

Log4j允許日志請求被輸出到多個輸出源。用Log4j的話說,一個輸出源被稱做一個Appender 。

一個logger可以設定超過一個的appender。

布局就是指輸出資訊的格式。在Log4j中稱作Layout

org.apache.log4j.HTMLLayout(以HTML表格形式布局), 

org.apache.log4j.PatternLayout(可以靈活地指定布局模式), 

org.apache.log4j.SimpleLayout(包含日志資訊的級别和資訊字元串), 

org.apache.log4j.TTCCLayout(包含日志産生的時間、線程、類别等等資訊)

%m 輸出代碼中指定的消息 

%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL 

%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數 

%c 輸出所屬的類目,通常就是所在類的全名 

%t 輸出産生該日志事件的線程名 

%n 輸出一個回車換行符,Windows平台為“\r\n”,Unix平台為“\n” 

%d 輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921 

%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)

Log4j有兩種配置方式,一種是xml格式,一種是properties格式。都是放置到classpath下面。預設名稱分别是:log4j.xml和log4j.properties

每個Appender都要引用自己的Layout。

每個Logger都可以指定一個級别,同時引用多個Appender;而一個Appender也同時可以被多個Logger引用。

首先要注意,log4j.xml優先于log4j.properties,如果同時存在log4j.xml和log4j.properites,以log4j.xml為準。

在log4j.properties裡,控制級别的時候,隻能列印出大于指定級别的所有資訊;但是在log4j.xml中可以通過filter來完成過濾:典型的引用是隻列印出某種級别的資訊。

可以通過logger的additivity=“false”屬性,來設定多個logger是否重複輸出同一條資訊

為什麼不是直接logger.debug(“debug:“+name);呢?

在配置檔案中雖然可以使用控制級别為比debug級别更高的級别,而不輸出debug資訊;但是,這裡的字元串連接配接操作仍然會影響運作效率;如果先判斷目前logger的級别,如果級别不合适的話,連這句字元串連接配接都可以不做了。

在java中使用log4j時,我們可以使用它的eclipse插件log4e。它的官方網址是:http://log4e.jayefem.de/,分為商業版本和免費版本。我們隻需要使用其免費版本,就可以極大的幫我們提高開發效率。比如:在一個類中聲明一個logger;幫我們寫麻煩的logger.isDebugEnabled();在一個方法開始的時候列印所有的參數;輸出一個變量等等。

除了使用log4j進行日志輸出之外,我們還可以使用jdk内置的日志系統。它位于java.util.logging包下,是以不需要引用額外的jar包。其基本概念與log4j大同小異,我們可以類比的學習。

其配置檔案位于jdk安裝目錄下的/jre/lib/logging.properties。

請同學們觀察配置檔案,自己找到我們在log4j裡找的Appender、Layout、級别和Logger,以及它們的關系。

簡單日記門面(simple logging Facade for java)SLF4J是為各種loging APIs提供一個簡單統一的接口,進而使得最終使用者能夠在部署的時候配置自己希望的loging APIs實作。

準确的說,slf4j并不是一種具體的日志系統,而是一個使用者日志系統的facade,允許使用者在部署最終應用時友善的變更其日志系統。

在系統開發中,統一按照slf4j的API進行開發,在部署時,選擇不同的日志系統包,即可自動轉換到不同的日志系統上。比如:選擇JDK自帶的日志系統,則隻需要将slf4j-api-1.5.10.jar和slf4j-jdk14-1.5.10.jar放置到classpath中即可,如果中途無法忍受JDK自帶的日志系統了,想換成log4j的日志系統,僅需要用slf4j-log4j12-1.5.10.jar替換slf4j-jdk14-1.5.10.jar即可( 當然也需要log4j的jar及 配置檔案)

log4j&slf4j日志架構入門

大家應該還記得,在log4j中,為了提高運作效率,往往在輸出資訊之前,還要進行級别判斷,以避免無效的字元串連接配接操作。如下:

if (logger.isDebugEnabled()){

logger.debug(“debug:“+name);

}

slf4j巧妙的解決了這個問題:先傳入帶有占位符的字元串,同時把其他參數傳入,在slf4j的内容部實作中,如果級别合适再去用傳入的參數去替換字元串中的占位符,否則不用執行。

logger.info("{} is {}", new String[]{“x",“y"});

轉載位址:http://sishuok.com/forum/blogPost/list/0/3740.html#8838

      本文轉自027ryan  51CTO部落格,原文連結:http://blog.51cto.com/ucode/1790136,如需轉載請自行聯系原作者