基於Log4j完成定時創建和刪除日志的方法


文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

1.背景

Log4j作為常用的日志生成工具,其清除日志的策略卻十分有限。只有在RollingFileAppender中可以通過設置MaxFileSize和maxBackupIndex屬性來指定要保留的日志文件大小以及個數,從而實現自動清除。

 

但是實際生產中,我們的真實的需求常常是定時生成日志,然后保留最近幾天的日志,歷史日志需要及時清理。可是Log4j中的DailyRollingFileAppender這個類卻不帶屬性maxBackupIndex,maxFileSize等,所以無法通過直接配置實現。

針對這種情況,一般方法是寫一個定時刪除日志的腳本等,這里我們討論一種通過繼承FileAppender,重新實現DailyRollingFileAppender類,並且帶有按時間順序清理日志的功能。

2.具體實現

2.1代碼實現

a.完成自定義的日期類和文件過濾類,為進行文件命名和查找做准備。

 

b.繼承FileAppender類,定義好文件輸出日期格式以及文件備份參數。

 

c.重寫核心的RollOver函數。

 
        

d.在RollOver函數中完成對備份數量的監測以及歷史日志的刪除。

2.2配置實現

 

3.Log4j各配置的含義

Log4j由三個重要的組件構成:日志信息的優先級,日志信息的輸出目的地,日志信息的輸出格式。日志信息的優先級從高到低有ERROR、WARN、 INFO、DEBUG,分別用來指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制台還是文件中;而輸出格式則控制了日志信息的顯示內容。Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。這里,我們主要探討基於XML的配置方式。

3.1配置根logger

基本語法是:

 

其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優 先級從高到低分別是ERROR、WARN、INFO、DEBUG。

這里,每一個appenderName均是下面需要配置的日志信息的名稱。

實際例子:

log4j.rootLogger=INFO ,stdout, ROLLING_ERROR_FILE, ROLLING_INFO_FILE

3.2配置日志信息輸出目的地Appeder

Log4j中提供的Appender主要有以下幾種:

org.apache.log4j.ConsoleAppender(控制台), 

org.apache.log4j.FileAppender(文件), 

org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件), 

org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件), 

org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

基本語法為:

實際例子:

log4j.appender.ROLLING_ERROR_FILE=org.apache.log4j.DailyRollingFileAppender

針對不同的Appender,它們的屬性也有一定的差別,這些屬性主要是針對日志文件的命名規則、保存路徑、刪除策略等有關系。

3.2.1 ConsoleAppender的屬性

Threshold=WARN:指定日志信息的最低輸出級別,默認為DEBUG。

ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。

Target=System.err:默認值是System.out。

3.2.2 FileAppender的屬性

Threshold=WARN:指定日志信息的最低輸出級別,默認為DEBUG。

ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。

Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。

File=D:/logs/logging.log4j:指定消息輸出到logging.log4j文件中。

3.2.3 DailyRollingFileAppender的屬性

Threshold=WARN:指定日志信息的最低輸出級別,默認為DEBUG。

ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。

Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。

File=D:/logs/logging.log4j:指定當前消息輸出到logging.log4j文件中。

DatePattern='.'yyyy-MM:每月滾動一次日志文件,即每月產生一個新的日志文件。當前月的日志文件名為logging.log4j,前一個月的日志文件名為logging.log4j.yyyy-MM。

另外,也可以指定按周、天、時、分等來滾動日志文件,對應的格式如下:

1)'.'yyyy-MM:每月

2)'.'yyyy-ww:每周

3)'.'yyyy-MM-dd:每天

4)'.'yyyy-MM-dd-a:每天兩次

5)'.'yyyy-MM-dd-HH:每小時

6)'.'yyyy-MM-dd-HH-mm:每分鍾

3.2.4 RollingFileAppender的屬性

Threshold=WARN:指定日志信息的最低輸出級別,默認為DEBUG。

ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。

Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。

File=D:/logs/logging.log4j:指定消息輸出到logging.log4j文件中。

MaxFileSize=100KB:后綴可以是KB, MB 或者GB。在日志文件到達該大小時,將會自動滾動,即將原來的內容移到logging.log4j.1文件中。

MaxBackupIndex=2:指定可以產生的滾動文件的最大數,例如,設為2則可以產生logging.log4j.1,logging.log4j.2兩個滾動文件和一個logging.log4j文件。

3.3 配置日志信息的格式(布局)layout

Log4j提供的layout有以下幾種:

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

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

org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串), 

org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

Log4j采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下: %m 輸出代碼中指定的消息

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

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

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

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

%n 輸出一個回車換行符,Windows平台為“rn”,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.appender.ROLLING_ERROR_FILE.layout=org.apache.log4j.PatternLayout

log4j.appender.ROLLING_ERROR_FILE.layout.ConversionPattern=[log] %d -%-4r [%t] %c %x%n %-5p - %m [%l] %n

 

                            -----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

                                                                                    如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                                                                                                            

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM