本篇介紹log4j的RollingFileApoender的基本用法。

先前的範例利用FileAppender輸出log訊息至文字檔中,但因為每次程式執行產生的log訊息都存在同個檔案,將導致儲存log的檔案將變得越來越大,並造成log訊息變得難以查找與管理。

因此若能控制log訊息輸出成檔案的大小及數目,log訊息將會比較好維護,而log4j的RollingFileAppender就提供了將log訊息輸出成多筆檔案的功能。

 

範例專案結構如下,log4j的組態檔為log4j.xml及用來產生log訊息的MainTest.java

 

 

MainTest.java

...

...

第8行for迴圈僅用來控制輸出的log訊息大小。

 

log4j.xml

...

...

說明

一開始先設定一個RollingAppender及其參數(line 4 ~ line 12)

appender要設定為"org.apache.log4j.RollingFileAppender" (line 4)

 

接著在<appender>...</appender>內有幾個參數要設定

file為輸出的檔案名稱及位置,範例中file的值為"log.out",則會輸出在Eclipse的workspace的專案目錄下 (line 5)

threhold為訊息等級,跟logger的level功能相同,例如若將值設為"error",則低於此層級的log事件將不會被記錄 (line 6)

immediateFlush,預設為true,意思是每一次執行結束後就將輸出串流寫出至檔案 (line 7)

append的值若為true則會將新的log訊息增加至原有檔案的下方,若為false則新的log訊息會覆蓋檔案內舊的訊息 (line 8)

maxFileSize設定輸出訊息檔案的大小 (line 9)

maxBackupIndex設定最大的檔案數目 (line 10)

參數設定別忘了設定這個appender的layout型式,本範例使用SimpleLayout,因此不用再設定pattern了(line 11)

 

Appender設定完後再來設定Logger,此範例使用rootLogger,所以用<root>...</root> (line 13 ~ line 16)

將rootLogger的訊息等級設定為DEBUG (line 14)

然後把剛設定好的RollingFileAppender附加在rootLogger (line 15)

 

設定完後就來執行MainTest.java測試看看

結果可在專案目錄下看到輸出的訊息檔"log.out",即為剛剛在log4j.xml第5行的設定結果。

 

將"log.out"的名稱改為"log.out.txt"即可用記事本開啟

 

文字檔內容即為輸出的log訊息。可以看到訊息從0 ~ 16重複了17次,即為在MainTest.java設定的for迴圈次數

 

可以看到剛輸出的log檔案大小為2.29KB,尚未超過在log4j.xml第9行設定的3KB,因此目前僅有一個檔案。

 

接著先把"log.out.txt"改回"log.out",然後再執行一次MainTest.java。

 

執行完可看到多了一個"log.out.1",檔案大小為3KB,到達log4j.xml第10行maxBackupIndex設定每筆檔案大小的上限。

 

一樣將"log.out.1"改為"log.out.1.txt",然後用記事本開啟。

可以看到執行第二次MainTest.java所新增的log訊息附加在第一次執行產生的log訊息之後,新的訊息從迴圈的0開始記錄,記錄到第5次即結束,因為在此已經達到檔案大小上限3KB了。

 

接著再把"log.out"這個檔案的名稱改為"log.out.txt"來觀察內容,

會發現執行第二次產生的log訊息是接續著"log.out.1"後,並從第6次開始記錄在這個檔案內。

 

接著把剛剛的"log.out.txt"及"log.out.1.txt"改回原本的"log.out"及"log.out.1"。

 

然後重複執行5次MainTest.java來看輸出的結果,到目前為止總共執行了7,執行完可看到多了新的log檔案如下。

 

若把全部的log檔如前面一樣將名稱改為後面加上".txt",並用記事本開啟可發現第一次執行的log訊息會在"log.out.5"這個檔案內,然後新的log訊息依序產生於"log.out.4","log.out.3"...,最後執行的log訊息在"log.out",和常理推斷的順序是相反的,要特別注意。

 

再把所有的檔案改回原來的名稱,然後再執行1次MainTest.java,會發現檔案還是維持原來的數量,因為在log4j.xml中maxBackupIndex的設定最多5個。

最後新增的檔案會輸出在"log.out"內,然後依"log.out.1","log.out.2"的順序覆蓋。

 

結論是感覺很難用,檔案名稱也不能依照自己的偏好改,若一開始把輸出名稱改為"log.txt",則第二個新的檔案會叫做"log.txt.1",一樣要更改名稱才能用記事本開啟,真麻煩。

 

下一篇介紹比較實用的DailyRollingFileAppender,可以依需求設定log檔的輸出時間,我覺得比RollingFileAppender更好用。

 

 

 

 

文章標籤
創作者介紹

菲比傻大姐&肉豬

phoebelin0606 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • sonyvsshadow
  • 菲姐你好,最近在看你log4j系列的紀錄
    寫的超詳細 & 易懂的,謝謝你

    然後這篇有個部份我不太懂,故留言詢問一下
    在約文章中上部分的
    log4j.xml 原始碼中
    line 6 <param name="threshold" value="debug"/>

    line 14 <priority value="DEBUG"/>
    這兩行我不太懂為何 log 輸出的層級要指定兩次,還是說兩行根本在講不一樣的東西 ?
    &
    假如一個寫 info 一個寫 ERROR ,會發生什麼事嗎 ?

    謝謝
  • 概念是line14的是root 的設定,line6是指這個appender A1的層級設定,A1為root的子設定,appender A1若沒設定則會繼承root的設定,如果root設定ERROR,A1設定INFO,則A1的設定會覆寫(override) root的設定這樣。只要記得log4j有繼承的特性,方便讓你個別選擇什麼部分需要什麼層級,或整體要做什麼設定這樣,你可以想像成root為抽象類別而A1為其子類別這樣應該就可以理解了。

    phoebelin0606 於 2016/12/17 14:02 回覆

找更多相關文章與討論