Log4j 的強大在於靈活的配置組合。本文系統整理所有核心 Appender 與 Layout 的參數詳解,並給出生產環境驗證過的最佳實踐配置模板,作為日誌治理的參考手冊。
| 參數 | 默認值 | 說明 |
|---|---|---|
Threshold | DEBUG | 最低輸出級別(DEBUG/INFO/WARN/ERROR/FATAL) |
ImmediateFlush | true | true=立即刷新輸出流,false=緩衝(性能略優但風險丟失日誌) |
Target | System.out | 輸出流:System.out 或 System.err |
| 參數 | 默認值 | 說明 |
|---|---|---|
File | 無 | 必填,日誌文件完整路徑 |
Append | true | true=追加,false=覆蓋 |
Threshold | DEBUG | 級別過濾 |
ImmediateFlush | true | 同 ConsoleAppender |
核心差異:自動按時間切割文件,無大小限制。
| 參數 | 說明 | DatePattern 示例 |
|---|---|---|
DatePattern | 滾動頻率模式(必填) | '.'yyyy-MM (月)、'.'yyyy-MM-dd (日)、'.'yyyy-MM-dd-HH (時)、'.'yyyy-MM-dd-HH-mm (分) |
File | 當前活躍日誌文件路徑 | 如 logs/app.log |
| 舊文件命名 | 自動重命名為 app.log.2024-01 |
注意:Log4j 1.x 的 DailyRollingFileAppender 存在並發切割丟失日誌缺陷,生產環境強烈建議遷移到 Log4j 2.x 的
RollingFileAppender或使用 Logback。
| 參數 | 說明 | 示例 |
|---|---|---|
MaxFileSize | 單個文件最大值,達到則滾動 | 10MB, 100KB, 1GB |
MaxBackupIndex | 保留備份文件數(含當前文件共 N+1 個) | 10 → 生成 app.log, app.log.1 ... app.log.10 |
File | 當前活躍文件路徑 | logs/app.log |
Append | true/false | true |
核心參數:ConversionPattern 定義輸出格式。
| 符號 | 含義 | 示例 |
|---|---|---|
%p | 級別 | DEBUG, ERROR |
%d | 日期,可帶格式 %d{yyyy-MM-dd HH:mm:ss,SSS} | 2024-01-15 10:30:45,123 |
%r | 啟動至今毫秒數 | 123456 |
%t | 線程名 | http-nio-8080-exec-1 |
%l | 調用位置(類.方法:行號),性能開銷大 | com.ex.Svc.method(Svc.java:25) |
%c | Logger 名(類全名) | com.example.service.UserService |
%M | 方法名 | login |
%F | 文件名 | UserService.java |
%L | 行號 | 25 |
%m | 日誌消息 | 用戶登錄成功 |
%n | 換行符(跨平台) | \r\n / \n |
%x | NDC (嵌套診斷上下文) | 用戶ID:123 |
%% | 輸出 % 字符 | % |
格式修飾符:%20c 右對齊寬度20、%-20c 左對齊、%.30c 截斷超長30字符。
經典生產模式:[%d{yyyy-MM-dd HH:mm:ss,SSS}] [%t] %-5p %c{1}:%L - %m%n
| 參數 | 默認值 | 說明 |
|---|---|---|
LocationInfo | false | true=輸出文件名行號(性能影響大) |
Title | Log4J Log Messages | HTML 頁面標題 |
### 根 Logger:級別 INFO,掛載 4 個 Appender
log4j.rootLogger=INFO, console, dailyFile, errorFile, mailFatal
### ========== 控制台(開發/測試環境開啟)==========
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss,SSS}] [%t] %-5p %c{1}:%L - %m%n
### ========== 每日滾動文件(主業務日誌)==========
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=INFO
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=${catalina.base}/logs/biz.log
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss,SSS}] [%t] %-5p %c{1}:%L - %m%n
### ========== 錯誤專用文件(僅 ERROR/FATAL,便於告警掃描)==========
log4j.appender.errorFile=org.apache.log4j.RollingFileAppender
log4j.appender.errorFile.Threshold=ERROR
log4j.appender.errorFile.ImmediateFlush=true
log4j.appender.errorFile.Append=true
log4j.appender.errorFile.File=${catalina.base}/logs/error.log
log4j.appender.errorFile.MaxFileSize=50MB
log4j.appender.errorFile.MaxBackupIndex=20
log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss,SSS}] [%t] %-5p %c{1}:%L - %m%n
### ========== 致命錯誤郵件告警(FATAL 級別觸發)==========
log4j.appender.mailFatal=org.apache.log4j.net.SMTPAppender
log4j.appender.mailFatal.Threshold=FATAL
log4j.appender.mailFatal.BufferSize=1
log4j.appender.mailFatal.From=alert@yourcompany.com
log4j.appender.mailFatal.SMTPHost=smtp.yourcompany.com
log4j.appender.mailFatal.SMTPPort=587
log4j.appender.mailFatal.SMTPUsername=alert@yourcompany.com
log4j.appender.mailFatal.SMTPPassword=yourpassword
log4j.appender.mailFatal.To=ops@yourcompany.com
log4j.appender.mailFatal.Subject=[FATAL] %c{1} - %m
log4j.appender.mailFatal.layout=org.apache.log4j.PatternLayout
log4j.appender.mailFatal.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss,SSS}] [%t] %-5p %c{1}:%L - %m%n
### ========== 關鍵模塊單獨調試(開發時臨時開啟)==========
# log4j.logger.com.example.core=DEBUG, console
# log4j.additivity.com.example.core=false
### ========== 關閉第三方噪音日誌 ==========
log4j.logger.org.springframework=WARN
log4j.logger.org.hibernate=WARN
log4j.logger.org.apache.kafka=WARN
log4j.logger.com.zaxxer.hikari=WARN
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.URL=jdbc:mysql://localhost:3306/logdb?useSSL=false
log4j.appender.db.driver=com.mysql.cj.jdbc.Driver
log4j.appender.db.user=loguser
log4j.appender.db.password=logpass
log4j.appender.db.sql=INSERT INTO app_logs (log_time, level, logger, thread, message) VALUES (?, ?, ?, ?, ?)
log4j.appender.db.layout=org.apache.log4j.PatternLayout
log4j.appender.db.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p %c %t %m
警告:JDBCAppender 同步寫入數據庫,高併發下嚴重拖慢業務。生產環境請使用異步寫入(Log4j 2.x AsyncAppender + 數據庫批量插入)或日誌收集系統(ELK/EFK、Kafka+ClickHouse)。
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.RemoteHost=log-collector.yourcompany.com
log4j.appender.socket.Port=4560
log4j.appender.socket.ReconnectionDelay=30000
log4j.appender.socket.LocationInfo=true
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss,SSS}] [%t] %-5p %c{1}:%L - %m%n
AsyncAppender 包裹文件 Appender,緩衝區 512+,防止業務線程阻塞於 I/O。%l、%F、%L、%M 需獲取堆棧信息,極大降低性能,生產環境禁用。${catalina.base}、${user.home}、環境變量,避免硬編碼路徑導致跨環境部署失敗。log4j.additivity.loggerName=false 禁止向父 Logger 傳遞,防止重複輸出。Log4j 1.x 已停止維護(2015 年 EOL),存在並發切割丟失日誌、無異步刷新、配置熱加載弱等缺陷。新項目強制使用 Log4j 2.x 或 Logback,存量項目制定遷移計劃。核心優勢:
遷移核心:依賴替換 → 配置文件轉換 (properties → xml/json/yaml) → 代碼無感(SLF4J 門面屏蔽底層)。