LOG4J 文檔學習筆記
1 入門執行個體
1.1 配置日志
- 建立一個JAva工程,導入包log4j-1.2.17.jar
- 在classpath建立并設定log4j.properties(src下或者resource中)
### 設定###
LOGDIR=E://logs
log4j.rootLogger = debug,stdout,D,E
### 輸出資訊到控制擡 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 輸出DEBUG 級别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${LOGDIR}/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 輸出ERROR 級别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =${LOGDIR}/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
1.2 編寫程式
package com.haoyutiangang;
import org.apache.log4j.Logger;
public class Test {
private static Logger logger = Logger.getLogger(Test.class);
public static void main(String[] args) {
// 記錄debug級别的資訊
logger.debug("This is debug message.");
// 記錄info級别的資訊
logger.info("This is info message.");
// 記錄error級别的資訊
logger.error("This is error message.");
}
}
1.3 檢視運作結果
控制台和日志檔案(略)
2 Log4j基本使用方法
Log4j由三個重要的元件構成:Loggers(記錄器),Appenders (輸出源)和Layouts(布局)。這裡可簡單了解為日志類别,日志要輸出的地方和日志以何種形式輸出。
Log4j支援兩種配置檔案格式,一種是XML格式的檔案,一種是Java特性檔案log4j.properties(鍵=值)。
下面将介紹使用log4j.properties檔案作為配置檔案的方法。
2.1 通用屬性配置
可以在log4j.properties的頂端配置一些通用屬性key=value(例如日志目錄),下面用到時使用 ${key} 即可。
LOG_DIR=c:\logs
...
log4j.appender.platform1.File=${LOG_DIR}/trace.log
2.2 配置logger
Logger 負責處理日志記錄的大部分操作。
其文法為:
log4j.logger.rootLogger = [ level ] , appenderName, appenderName, …
log4j.logger.com.test = [ level ] , appenderName, appenderName, …
log4j.logger.com.test.TestClass = [ level ] , appenderName, appenderName, …
log4j.logger.customName = [ level ] , appenderName, appenderName, …
- rootLogger表示根Logger,其他類的logger都繼承rootLogger
- 包/類Logger都要寫全名因為一級一級存在繼承關系
- 自定義Logger不參與包/類Logger的繼承,但是也繼承rootLogger
(1) level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級别。
(2) Log4j建議隻使用四個級别,優先級從高到低分别是ERROR、WARN、INFO、DEBUG。
(3) ALL: 列印所有的日志,OFF:關閉所有的日志輸出。
(4) appenderName就是指定具體的日志輸出方式,可同時指定多個輸出目的地。
2.3 配置Appender:日志資訊輸出目的地
Appender 負責控制日志記錄操作的輸出。
Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(檔案),
org.apache.log4j.DailyRollingFileAppender(每天産生一個日志檔案),
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候産生一個新的檔案)
org.apache.log4j.WriterAppender(将日志資訊以流格式發送到任意指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
就是定義一個名為stdout的輸出目的地,ConsoleAppender為控制台。
配置模式:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
這裡的appenderName為在2.1裡定義的,可任意起名。
2.3 配置Layout:日志資訊布局方式
Layout 負責格式化Appender的輸出。
Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志資訊的級别和資訊字元串),
org.apache.log4j.TTCCLayout(包含日志産生的時間、線程、類别等等資訊)
配置模式:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
2.4 配置PatternLayout:輸出格式化
Log4J采用類似C語言中的printf函數的列印格式格式化日志資訊,
列印參數如下:
%p:輸出日志資訊的優先級,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:輸出自應用程式啟動到輸出該log資訊耗費的毫秒數。
%t:輸出産生該日志事件的線程名。
%l:輸出日志事件的發生位置,相當于%c.%M(%F:%L)的組合,包括類全名、方法、檔案名以及在代碼中的行數。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:輸出日志資訊所屬的類目,通常就是所在類的全名。
%M:輸出産生日志資訊的方法名。
%F:輸出日志消息産生時所在的檔案名稱。
%L::輸出代碼中的行号。
%m::輸出代碼中指定的具體日志資訊。
%n:輸出一個回車換行符,Windows平台為”rn”,Unix平台為”n”。
%x:輸出和目前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。
%%:輸出一個”%”字元。
另外,還可以在%與格式字元之間加上修飾符來控制其最小長度、最大長度、和文本的對齊方式。如:
1) c:指定輸出category的名稱,最小的長度是20,如果category的名稱長度小于20的話,預設的情況下右對齊。
2)%-20c:”-“号表示左對齊。
3)%.30c:指定輸出category的名稱,最大的長度是30,如果category的名稱長度大于30的話,就會将左邊多出的字元截掉,但小于30的話也不會補空格。
3 Log4j的java特性
Logger之間是具有java的繼承特性的。Log4j有一個rootLogger,所有普通logger都預設繼承rootLogger。而普通logger之間的繼承關系是通過logger name來實作的。
例如,叫”com.foo.Bar”名字的logger就繼承于叫”com.foo”名字的logger。就好像java中”java.util” 和”java.util.Vector”的關系一樣。
而這些繼承關系決定了logger的Level和Appender這兩個屬性的确定。
3.1 Level的确定
如果一個普通logger定義了Level,則其level就使用它定義的(例如:logger X),如果沒有定義,就使用其父logger的(例如:logger X.Y)。
3.2 Appender的确定
AdditivityFlag: true/false 是否向上傳遞将日志輸出到其父的Appender中。
- 如果一個普通logger定義Appender且其AdditivityFlag是true,則該logger的Appender包括其定義的Appender及其父logger定義的Appender。
- 如果一個普通logger沒有定義Appender,但其AdditivityFlag是true,則該logger的Appender為其父logger定義的Appender。
- 如果一個普通logger定義了Appender,但其AdditivityFlag是false,則該logger的Appender隻為其定義的Appender。
4 配置舉例
4.1 輸出到控制台
### 輸出到控制台
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=warn //過濾級别,預設debug
log4j.appender.stdout.ImmediateFlush=true //表示所有消息都會被立即輸出,設為false則不輸出,預設值是true。
log4j.appender.stdout.Target = System.err //預設值是System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %p %c{ }:%L - %m%n
4.2 輸出到指定檔案
### 輸出到指定檔案
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.Threshold=warn //過濾級别,預設debug
log4j.appender.file.ImmediateFlush=true //表示所有消息都會被立即輸出,設為false則不輸出,預設值是true。
log4j.appender.file.Append=false //是否追加,預設是true,false時覆寫
log4j.appender.file.File=C:\\file.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss} %p %l [%t] %m%n
4.3 輸出到按大小滾動的檔案
### 輸出到按大小滾動的檔案
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.Threshold=warn //過濾級别,預設debug
log4j.appender.file.ImmediateFlush=true //表示所有消息都會被立即輸出,設為false則不輸出,預設值是true。
log4j.appender.file.Append=false //是否追加,預設是true,false時覆寫
log4j.appender.file.File=C:\\loging.log
log4j.appender.file.MaxFileSize=MB //滾動門檻值,字尾可以是KB, MB 或者GB
log4j.appender.file.MaxBackupIndex= //可滾動檔案數,設為則可以産生logging.log,logging.log兩個滾動檔案和一個logging.log檔案
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-p %c{}:%L - %m%n
4.4 輸出到按時間滾動的檔案
### 輸出到按時間滾動的檔案
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=warn //過濾級别,預設debug
log4j.appender.dailyFile.ImmediateFlush=true //表示所有消息都會被立即輸出,設為false則不輸出,預設值是true。
log4j.appender.dailyFile.Append=true //是否追加,預設是true,false時覆寫
log4j.appender.dailyFile.File=C:\\logging.log
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd //目前日的日志檔案名為logging.log,前一天的日志檔案名為logging.log.yyyy-MM
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-p - %m%n
# 另外,也可以指定按月、周、天、時、分等來滾動日志檔案,對應的格式如下:
# 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:每分鐘
參考文獻
官方文檔:http://logging.apache.org/log4j/1.2/manual.html
最詳細的Log4j使用教程:http://blog.csdn.net/liweibin_/article/details/11984895
slf4j配置執行個體:http://www.codeceo.com/article/log4j-usage.html
Log4J日志配置詳解:http://www.cnblogs.com/ITtangtang/p/3926665.html