1. 程式人生 > 其它 >log4j 簡易教程

log4j 簡易教程

技術標籤:JavawebJavajavalog4j

1. jar 包配置

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2. 編寫配置檔案

可以有兩種格式的配置檔案,這裡以 properties 檔案為例

log4j 包含三個元件,分別是 Logger(記錄器)、Appender(輸出目的地)、Layout(日誌佈局)。可分別簡單理解為"日誌類別"、“日誌要輸出的地方"和"日誌以何種形式輸出”。

2.1 配置Logger記錄器

log4j.rootLogger = [ level ] , appenderName, appenderName, …

log4j 級別:

  • ALL : 各級包括自定義級別 ;

  • TRACE : 指定細粒度比 DEBUG 更低的資訊事件 ;

  • DEBUG : 除錯級別 ;

  • INFO : 表明訊息在粗粒度級別上突出強調應用程式是非常有幫助的 , 也就是輸出一些提示資訊 ;

  • WARN : 輸出潛在的有可能出錯的情形 , 也就是輸出警告資訊 ;

  • ERROR : 指出發生的不影響系統繼續執行的錯誤資訊 ;

  • FATAL : 指出嚴重的錯誤 , 這些錯誤將會導致系統終止執行 ;

  • OFF : 為最高級別 , 用於關閉所有日誌資訊的輸出 ;

核心規則 : log4j 只會輸出級別大於或者等於指定級別的資訊

log4j 建議使用四個級別,優先順序從高到低分別是 ERRORWARNINFODEBUG

通過在這裡定義的級別,你可以控制到應用程式中相應級別的日誌資訊的開關。比如在這裡定義了INFO級別,則應用程式中所有DEBUG級別的日誌資訊將不被打印出來。

appenderName 就是指日誌輸出的目的。你可以靈活地定義日誌輸出,也可以同時指定多個輸出目的地。

log4j 配置檔案實現了輸出到控制檯、檔案、回滾檔案、傳送日誌郵件、輸出到資料庫日誌表、自定義標籤等全套功能。

2.2 配置Appender

2.2.1 配置 appender 的 class

log4j.appender.appenderName = fully.qualified.name.of.appender.class

appenderName 就是配置 rootLogger 時寫的 appenderName

appender.class 提供以下幾種

  • org.apache.log4j.ConsoleAppender(控制檯)
  • org.apache.log4j.FileAppender(檔案)
  • org.apache.log4j.DailyRollingFileAppender(按照一定的頻度滾動產生日誌記錄檔案 , 預設每天產生一個檔案)
  • org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)
  • org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到指定的位置)

2.2.2 配置該 appender 的各種屬性

 log4j.appender.appenderName.option = value

一般來說配置如下幾個就行了

# 設定
log4j.rootLogger=debug,console,file

# 輸出資訊到控制抬
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

# 輸出到檔案
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/ice.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG 
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
  • Target

    預設值為 System.out , 輸出到控制檯 , 還可以取值 System.err , 當做錯誤資訊輸出 , 輸出的資訊全部為紅色 ;

  • Threshold

    rootLogger 裡配置 debug , 然後某個檔案專門儲存 error 以及更高級別的錯誤資訊 , 那麼就在這個配置這個檔案的時候指定 Threshold 屬性為 error

  • ImmediateFlush

    預設值是true , 意味著所有的訊息都會被立即輸出 , false則是不輸出

  • File

    指定日誌輸出到指定位置 , 用的是相對於專案根目錄的相對路徑

  • File.Append

    預設值是true , 即將訊息追加到指定檔案中 , 如果取值為false , 則會覆蓋之前的日誌內容

  • MaxFileSize

    字尾可以是KB , MB , GB , 當日志文件的大小到達指定大小後 , 將會自動滾動 , 即將原來的內容移到 fileName.1 檔案中 , 用記事本開啟該檔案即可看到原來的內容 , 改屬性只能在 appender=org.apache.log4j.RollingFileAppender 時使用

  • MaxBackupIndex

    指定可以產生滾動檔案的最大數量 , 與 RollingFileAppenderMaxFileSize 屬性一起使用 , 當 MaxBackupIndex=n 的時候 , 最大日誌存在數量為 n+1 , 即 log.txt , log.txt.1 , … , log.txt.n , 當在伺服器上執行的時候 , 如果對日誌數量沒有限制 , 那麼隨之時間的推移 , 日誌檔案會越來越多 , 佔用的記憶體也將越來越多 , 直到佔滿整個盤

  • DatePattern

    該屬性在 log4j.appender.appenderName=org.apache.log4j.DailyRollingFileAppender 時使用 , DailyRollingFileAppender 預設的頻度是每天產生一個日誌記錄檔案 , 可以在DatePattern屬性值中指定其他的頻度 , 常用的幾個頻度如下 :

    • ’.'yyyy-MM : 每月產生一個日誌記錄檔案
    • ’.'yyyy-ww : 每週產生一個日誌記錄檔案
    • ’.'yyyy-MM-dd : 每天產生一個日誌記錄檔案
    • ’.'yyyy-MM-dd-a : 每半天產生一個日誌記錄檔案
    • ’.'yyyy-MM-dd-HH : 每小時產生一個日誌記錄檔案
    • ’.'yyyy-MM-dd-HH-mm : 每分鐘產生一個日誌記錄檔案

    該屬性指定值之後 , 將會按照指定的頻度來生成日誌記錄檔案 , 假設指定生成一個名為 log.txt 的檔案 , 頻度指定為每分鐘產生一個日誌記錄檔案 , 當達到指定頻度後 , 會將log.txt檔案中記錄的之前的日誌記錄 , 重新寫入一個名為 log.txt.yyyy-MM-dd-HH-mm的檔案中 , 而此時 log.txt 檔案中存放的是新生成的日誌資訊 , 該過程迴圈往復

  • layout

    log4j中提供的layout有以下幾種 :

    • org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
    • org.apache.log4j.PatternLayout(可以靈活的指定佈局模式 , 需要配置 layout.ConversionPattern 屬性)
    • org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串)
    • org.apache.log4j.TTCCLayout(包含日誌產生的時間 , 執行緒 , 類別等等資訊)

2.2.3 ConversionPattern 格式說明

假設當前 java 檔名為 Test , 所在包名為log4j

  • %p:日誌優先順序,如 DEBUG、INFO 等

  • %c:顯示當前 logger 空間全稱 , 例如 log4j.Test
    %c{層數}:最內層的java檔案為第一層 , 例如 : %c{1} , 顯示為Test , 當層數大於實際存在的最大層數時 , 顯示最大實際存在層數

  • %10c:若名字空間長度小於10 , 則在左邊將欠缺的長度用空格補齊 , 該種情況為預設的右對齊方式

    %-10c:若名字空間長度小於10 , 則在右邊將欠缺的長度用空格補齊 , 該種情況為預設的左對齊方式

  • %.3c: 從空間名最右邊開始顯示指定的長度 , 超出該長度的部分將被擷取

  • %10.15c : 若空間名長度小於10 , 則左邊將欠缺的長度用空格補齊 , 若長度超過15 , 則將多餘部分擷取

    %-10.15c : 若空間名長度小於10 , 則右邊將欠缺的長度用空格補齊 , 若長度超過15 , 則將多餘部分擷取

  • %d : 顯示日誌記錄時間 , 預設時間格式為 ISO8601 定義的日期格式

    %d{yyyy-MM-dd HH:mm:ss} : 按照指定的時間格式顯示日期

  • %F : 顯示呼叫logger的原始檔名 , 例如 : Test.java

  • %l : 輸出日誌事件的發生位置 , 包括類目名 , 發生的執行緒 , 以及在程式碼中的行數 , 例如 : log4j.log4jTest.main(log4jTest.java:40)

  • %m : 顯示輸出訊息

  • %n:換行

  • %M : 顯示呼叫 logger 的方法名

  • %r : 顯示從程式啟動時到記錄該條日誌時已經經過的時間 , 單位毫秒

  • %t: 顯示產生該日誌條目的執行緒名

  • %x : 按NDC(Nested Diagnostic Context , 執行緒堆疊) : 順序輸出日誌

    %X: 按MDC(Mapped Diagnostic Context , 執行緒對映表)輸出日誌 , 通常用於多個客戶端連線同一個伺服器 , 方便伺服器區分是哪個客戶端訪問留下來的日誌

  • %% : 顯示一個百分號

2.2.4 LevelRangeFilter(分級過濾器)

如果想要實現不同級別的日誌分別輸出到不同的位置 , 可以在properties配置檔案中加入如下語句進行限制 , 例如

log4j.appender.appenderName.Threshold=debug
log4j.appender.appenderName.filter.filterName=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.appenderName.filter.filterName.LevelMin=debug
log4j.appender.appenderName.filter.filterName.LevelMax=debug

將最低輸出級別 LevelMin 和最高輸出級別 LevelMax 都設定為 debug , 那麼就只能輸出 debug 級別的日誌資訊了