實務專案常需將不同業務日誌 (交易、審計、效能、錯誤) 分離至獨立檔案。本文詳解 Log4j 1.x 透過多 Appender、Logger 加載項控制實現多檔案輸出、關閉預設輸出、路徑動態化配置,並完整解析 PatternLayout 佔位符含義。
在 Java 類別中定義多個 Logger,對應不同 Appender:
// Test.java
private static final Log logger1 = LogFactory.getLog("biz.trade");
private static final Log logger2 = LogFactory.getLog("biz.audit");
# 根日誌器 (保留控制台輸出)
log4j.rootLogger=DEBUG, stdout, file
# 控制台輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
# 預設滾動檔案
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logs/app.log
log4j.appender.file.MaxFileSize=128MB
log4j.appender.file.MaxBackupIndex=3
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
# === 獨立業務日誌 1 ===
log4j.logger.biz.trade=DEBUG, tradeFile
log4j.additivity.biz.trade=false # 關鍵:不傳遞給 rootLogger
log4j.appender.tradeFile=org.apache.log4j.FileAppender
log4j.appender.tradeFile.File=logs/trade.log
log4j.appender.tradeFile.layout=org.apache.log4j.PatternLayout
log4j.appender.tradeFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
# === 獨立業務日誌 2 ===
log4j.logger.biz.audit=DEBUG, auditFile
log4j.additivity.biz.audit=false
log4j.appender.auditFile=org.apache.log4j.FileAppender
log4j.appender.auditFile.File=logs/audit.log
log4j.appender.auditFile.layout=org.apache.log4j.PatternLayout
log4j.appender.auditFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
log4j.additivity.loggerName=false:禁止該 Logger 的日誌事件向父 Logger (rootLogger) 傳遞適用於部署環境路徑不固定、需區分實例日誌目錄:
log4j.rootLogger=DEBUG, INFOLOG, DEBUGLOG
# INFO 日誌 - 每日滾動
log4j.appender.INFOLOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.INFOLOG.File=${log.dir}/${log.info.file}
log4j.appender.INFOLOG.DatePattern=.yyyy-MM-dd
log4j.appender.INFOLOG.Threshold=INFO
log4j.appender.INFOLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.INFOLOG.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
# DEBUG 日誌 - 大小滾動
log4j.appender.DEBUGLOG=org.apache.log4j.RollingFileAppender
log4j.appender.DEBUGLOG.File=${log.dir}/${log.debug.file}
log4j.appender.DEBUGLOG.Threshold=DEBUG
log4j.appender.DEBUGLOG.MaxFileSize=128MB
log4j.appender.DEBUGLOG.MaxBackupIndex=3
log4j.appender.DEBUGLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUGLOG.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
// 主程式啟動早期 / ServletContextListener / Spring 初始化
System.setProperty("log.dir", "/var/log/myapp"); // 日誌根目錄
System.setProperty("log.info.file", "info.log"); // INFO 檔名
System.setProperty("log.debug.file", "debug.log"); // DEBUG 檔名
// 之後再初始化 Log4j (PropertyConfigurator.configure 或 Spring 自動載入)
PropertyConfigurator.configure("log4j.properties");
| 符號 | 含義 | 範例輸出 |
|---|---|---|
%c | Logger 完整名稱 (類別全名) | com.example.service.UserService |
%d | 日期時間 (預設 ISO8601) | 2024-01-15 14:30:00,123 |
%d{pattern} | 自訂日期格式 | %d{yyyy-MM-dd HH:mm:ss} → 2024-01-15 14:30:00 |
%f | 類別簡短名稱 (不含套件) | UserService |
%l | 呼叫位置 (類別.方法:行號) | com.example.UserService.save:42 |
%m | 日誌訊息內容 | 用戶登入成功 |
%n | 換行符 (平台相關) | \n (Linux) / \r\n (Windows) |
%p | 優先級 (DEBUG/INFO/WARN/ERROR/FATAL) | INFO |
%r | 應用啟動至今毫秒數 | 123456 |
%t | 執行緒名稱 | http-nio-8080-exec-3 |
%M | 方法名稱 | save |
%L | 行號 | 42 |
LogFactory.getLog("custom.name") 時,%c 顯示自訂名稱而非類別名。若需類別名請用 LogFactory.getLog(ThisClass.class)additivity=false 導致同時寫入預設檔案RollingFileAppender 或 Log4j 2.x%l、%M、%L 需建立堆疊追蹤,高頻日誌請移除<Loggers>
<Logger name="biz.trade" level="DEBUG" additivity="false">
<AppenderRef ref="TradeFile"/>
</Logger>
<Logger name="biz.audit" level="DEBUG" additivity="false">
<AppenderRef ref="AuditFile"/>
</Logger>
<Root level="DEBUG">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
<Appenders>
<File name="TradeFile" fileName="${sys:log.dir}/trade.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n"/>
</File>
<File name="AuditFile" fileName="${sys:log.dir}/audit.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n"/>
</File>
</Appenders>
此配置指南涵蓋了 Log4j 1.x 多檔案隔離、動態路徑、加載項控制的完整實務知識,可直接應用於專案日誌架構設計。