log4j 簡易教程
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 建議使用四個級別,優先順序從高到低分別是 ERROR、WARN、INFO、DEBUG。
通過在這裡定義的級別,你可以控制到應用程式中相應級別的日誌資訊的開關。比如在這裡定義了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
指定可以產生滾動檔案的最大數量 , 與
RollingFileAppender
和MaxFileSize
屬性一起使用 , 當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 級別的日誌資訊了