【第158期 November 5, 2010】
 

研發新視界

實用的log記錄工具--log4j

作者/莊育明

[發表日期:2010/10/22]



前言

在程式開發與維護的過程中,我們常借助log來了解程式執行狀態、debug或於日後追蹤相關錯誤。由Apache所提供的log4j則是對於運用Java當作開發語言的人來說是個相當實用的輔助工具。

log4j網站(http://logging.apache.org/log4j/)上提到1.2是目前較為穩定的系列,目前也僅有此系列可供下載讓程式開發者應用 (1.3系列的新功能與1.2有相容上的問題,2.0則仍處於實驗階段)。

主要組成

Loggers, Appenders和Layouts這三部分組成log4j,藉此可使程式開發者按照相關的訊息型態、階層規則將需要的訊息記錄下來。與利用System.out.println時只能將log記在console相比,透過log4j更能選擇將訊息存往不同路徑,進一步系統性地管理訊息。

操作說明

一、將官網下載下來的loj4j壓縮檔解開後,把log4j-1.2.xx.jar置入classpath or程式存放library的地方。

二、程式部分

1.需先import org.apache.log4j.Logger;
2.定義Logger (上述lo4j的主要成分),如: static Logger logger = Logger.getLogger("monitorLogger")
3.於程式適當處放入要寫log的相關與法,如: logger.debug(“此監控回合已結束”)

而第2點所提到的monitorLogger以及第3點所提的debug皆詳細定義於設定檔中。


三、設定檔部分 (以properties檔或xml檔的方式皆可),如下圖所示:


1.一般會應用到的log4j訊息層級有六種,其層級為trace< debug< info< warn< error< fatal。另外還有顯示所有log的層級all與不顯示任何log的層級off。

在上面設定檔一開始的log4j.logger. monitorLogger = debug, ML表示將訊息層級設定為debug,可將程式中debug~fatal層級的訊息輸出。若改為log4j.logger. monitorLogger = info, ML,則僅可將info~fatal層級的訊息輸出

2.多個Logger可共用同一個Appender,如下:


除了各Logger可分別設定輸出的訊息層級外,也可設定此Appender允許何層級的訊息 (如:log4j.appender.ML.Threshold = debug),並以Logger與Appender所規範的較高層級為主。

3.上方訊息檔中” 輸出log檔案的方式”採用RollingFileAppender,是以個別檔案的方式產出。按照其設定為每個檔案300KB,最多只會有11個檔案。超過此範圍的舊訊息將會被洗掉 (e.g. 第一個檔案的首筆訊息出現於10/1 8:00,第二筆訊息出現於8:03。當log達檔案容量上限、新訊息插入log檔時,最舊的一筆訊息將為10/1 8:03。再也無法檢視10/1 8:00訊息內容)。

4.續3,亦可使用DailyRollingFileAppender (將log分日期)將log檔輸出:


(視需要可調整DatePattern,建立檔案的最小單位為每分鐘,最大可以是每個月產一個檔。詳情請參閱http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html)

5.以log4j.appender.ML.layout.ConversionPattern = %p %c (%L) [%d{yyy-MM-dd HH:mm:ss}] - %m%n輸出的訊息格式為:

%p, %c, %L, %d皆定義於PatternLayout

6.另外,log4j可將log寫入DB或透過mail發送

註: 除了log4j,Apache提供的logging services (記錄log的服務)當中也有提供for C++的log4cxx、for PHP的logphp等等

參考資料

http://logging.apache.org/log4j/1.2/manual.html
http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Level.html
http://www.javaworld.com.tw/jute/post/view?bid=11&id=186896&sty=1&tpg=1&age=0