log4j日誌處理

什麼是Log4j

Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日誌信息輸送的目的地是控制檯、文件、GUI組件、甚至是套接口服務 器、NT的事件記錄器、UNIXSyslog守護進程等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細緻地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。

log4j原理

Log4j設計實現為分層結構,每一層都提供了不同的類,實現不同功能的對象執行不同的任務,在實際的使用中可以根據自己的具體需求靈活的進行擴展。不同組件的框架圖如下:

log4j日誌處理

由圖可以看出,log4j框架核心對象主要有三種:

  • Logger 對象,在程序使用中往往只會接觸到這一對象,Logger對象負責獲取不同級別日誌信息;

  • Layout對象,該層提供用於格式化不同風格的日誌信息的對象;

    Appender對象,負責發佈日誌信息,可以指定將日誌信息輸出的目的地,可以是控制檯終端、文件、數據庫、Unix syslog等;

    還有四種輔助對象:

  • Level對象:用於定義日誌的級別,這個想必大家都不會陌生,Linux系統中是非常常用的(比如開發內核程序,常常用printk打印日誌以此調試程序)。主要有以下幾種

  1. off 最高等級,用於關閉所有日誌記錄。

  2. fatal 指出每個嚴重的錯誤事件將會導致應用程序的退出。

  3. error 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。

  4. warm 表明會出現潛在的錯誤情形。

  5. info 一般和在粗粒度級別上,強調應用程序的運行全程。

  6. debug 一般用於細粒度級別上,對調試應用程序非常有幫助。

  7. all 最低等級,用於打開所有日誌記錄。

    Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG,定義一個較低級別的話,會將比其級別高的日誌信息全部打印出來;

  • Filter對象:主要用於分析過濾日誌信息,判斷是否應該記錄;

  • ObjectRenderer對象:用於提供不同對象的toString方法;

  • LogManager對象:主要負責Log4j的初始化配置。

Log4J最核心的也就5個類:

  • Logger用於對日誌記錄行為的抽象,提供記錄不同級別日誌的接口;

  • Level對日誌級別的抽象;

  • LoggingEvent是對一次日誌記錄過程中所能取到信息的抽象;

  • Appender是對記錄日誌形式的抽象;

  • Layout是對日誌行格式的抽象;

log4j二次開發

Log4j中有org.apache.log4j.FileAppender類,該類實現了將日誌文件輸出到文件,其有兩個子類(更詳盡的信息參看http://logging.apache.org/log4j/1.2/apidocs/):

DailyRollingFileAppender:實現了根據時間對日誌文件進行切割,主要的成員變量為

private String datePattern = "'.'yyyy-MM-dd"; //按天切割日誌文件

RollingFileAppender:實現了根據日誌文件的大小對日誌文件切割,而且還可以指定日誌文件的個數,超過指定個數的日誌文件將會被刪除。主要是依靠成員變量:

protected long maxFileSize = 10*1024*1024; //默認的日誌文件大小protected int maxBackupIndex = 1; //默認的日誌文件個數

這些成員變量信息都可以在Log4j的配置文件log4j.properties中重新指定新值。

現在要做的就是將RollingFileAppender和DailyRollingFileAppender類的功能結合起來,保證DailyRollingFileAppender大框架不變的前提下支持maxBackupIndex參數,以及可以實現超過指定日誌文件個數的日誌文件被刪除。

實現步驟

代碼中主要使用了java.util包中的集合類和java.io包中的File類。

1.在DailyRollingFileAppender類中添加maxBackupIndex屬性;

2.定義了日誌文件的後綴是日期格式,如log1.log-2016-10-23-12,使用File類獲取目錄的日誌文件;

3.將文件按日期排序存儲在Map集合中(相當於白名單),存儲的個數為指定的maxBackupIndex個;

4.遍歷日誌目錄文件,使用集合的comtains方法依次判斷是否是白名單中的,不屬於的即就是距離現在最遠的文件,則調用定義的delete方法實現刪除多餘的文件;


分享到:


相關文章: