Log4j 的設定檔(通常命名為 log4j.properties)是控制日誌記錄行為的核心。它採用鍵值對(key=value)或 XML 格式定義記錄器層級、輸出目的地以及日誌輸出格式。透過適當配置,即可建立符合專案需求的 Log4j 執行環境。
根記錄器是所有日誌記錄器的祖先,其語法為:
log4j.rootLogger = [level], appenderName1, appenderName2, ...
level 定義日誌輸出等級,共五級(由高到低):
FATAL (0)ERROR (3)WARN (4)INFO (6)DEBUG (7)Appender 決定日誌輸出去向,常見類型包括:
org.apache.log4j.ConsoleAppender - 控制台輸出org.apache.log4j.FileAppender - 檔案輸出org.apache.log4j.DailyRollingFileAppender - 每日產生新檔案org.apache.log4j.RollingFileAppender - 檔案達指定大小時滾動org.apache.log4j.WriterAppender - 以流形式發送至指定位置Layout 定義日誌訊息的顯示格式:
org.apache.log4j.HTMLLayout - HTML 表格形式org.apache.log4j.PatternLayout - 靈活指定模式(最常用)org.apache.log4j.SimpleLayout - 包含等級與訊息字串org.apache.log4j.TTCCLayout - 包含時間、執行緒、類別等資訊| 字元 | 說明 |
|---|---|
| %m | 輸出程式碼中指定的訊息 |
| %p | 輸出優先級(DEBUG, INFO, WARN, ERROR, FATAL) |
| %r | 應用啟動至輸出該 log 耗費的毫秒數 |
| %c | 輸出所屬類目(通常為完整類名) |
| %t | 輸出產生日誌事件的執行緒名稱 |
| %n | 換行符(Windows: \r\n, Unix: \n) |
| %d | 輸出日期時間,預設 ISO8601,可自訂格式如 %d{yyyy-MM-dd HH:mm:ss,SSS} |
| %l | 輸出發生位置(類名、執行緒、行號),如 Testlog4.main(TestLog4.java:10) |
"%-4r [%t] %-5p %c %x - %m%n",預設等級 DEBUG。利用 Threshold 參數可讓特定 Appender 只記錄特定等級以上的日誌。例如:將錯誤日誌單獨寫入 error.log,一般日誌寫入 log.log:
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 = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
# 一般日誌檔(每日滾動)
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/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 以上)
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/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
可透過 log4j.logger.<packageName>=level 覆寫特定套件的日誌等級,例如:
log4j.logger.org.springframework.orm.hibernate3.support.OpenSessionInViewFilter=debug
log4j.logger.org.apache.struts.util=WARN
原理:Log4j 會優先匹配最精確的記錄器名稱,若無設定則繼承父層級設定。
# 根記錄器:DEBUG 等級,輸出至控制台與檔案
log4j.rootLogger=DEBUG,myConsole,myLogFile
# 控制台 Appender
log4j.appender.myConsole=org.apache.log4j.ConsoleAppender
log4j.appender.myConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.myConsole.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.myConsole.threshold=FATAL
# 滾動檔案 Appender
log4j.appender.myLogFile=org.apache.log4j.RollingFileAppender
log4j.appender.myLogFile.File=mylog.log
log4j.appender.myLogFile.MaxFileSize=100KB
log4j.appender.myLogFile.MaxBackupIndex=2
log4j.appender.myLogFile.layout=org.apache.log4j.PatternLayout
log4j.appender.myLogFile.layout.ConversionPattern=%d{MMM d,yyyy hh:mm:ss a} : %p [%t] %m%n
log4j.appender.myLogFile.threshold=ERROR
INFO 或 WARN,避免過多 DEBUG 輸出影響效能。RollingFileAppender 或 DailyRollingFileAppender 防止單一檔案過大。Threshold 將錯誤日誌隔離,利於快速排查問題。