天天看點

LOG4J 文檔學習筆記LOG4J 文檔學習筆記

LOG4J 文檔學習筆記

1 入門執行個體

1.1 配置日志

  1. 建立一個JAva工程,導入包log4j-1.2.17.jar
  2. 在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, …
           
  1. rootLogger表示根Logger,其他類的logger都繼承rootLogger
  2. 包/類Logger都要寫全名因為一級一級存在繼承關系
  3. 自定義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中。
  1. 如果一個普通logger定義Appender且其AdditivityFlag是true,則該logger的Appender包括其定義的Appender及其父logger定義的Appender。
  2. 如果一個普通logger沒有定義Appender,但其AdditivityFlag是true,則該logger的Appender為其父logger定義的Appender。
  3. 如果一個普通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