首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Log4j 多自訂日誌檔案配置完整指南:獨立輸出、路徑動態化、加載項解析

     編輯:Java 相關知識

實務專案常需將不同業務日誌 (交易、審計、效能、錯誤) 分離至獨立檔案。本文詳解 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.properties 配置

# 根日誌器 (保留控制台輸出)
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

關鍵機制:additivity (加載項)

  • log4j.additivity.loggerName=false:禁止該 Logger 的日誌事件向父 Logger (rootLogger) 傳遞
  • 未設定或 true:日誌會同時輸出到自身 Appender 和 rootLogger 的 Appender (控制台、預設檔案)
  • 設定 false 後:僅輸出到指定 Appender,實現完全隔離

場景二:日誌路徑動態化 (啟動時指定)

適用於部署環境路徑不固定、需區分實例日誌目錄:

log4j.properties 使用系統屬性佔位符

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");

PatternLayout 佔位符完整對照表

符號含義範例輸出
%cLogger 完整名稱 (類別全名)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

常見問題與最佳實踐

  • 類別名顯示為 Logger 名稱:使用 LogFactory.getLog("custom.name") 時,%c 顯示自訂名稱而非類別名。若需類別名請用 LogFactory.getLog(ThisClass.class)
  • 重複日誌:忘記設定 additivity=false 導致同時寫入預設檔案
  • 檔案鎖定/無法刪除:Windows 下 FileAppender 持有檔案鎖,滾動/刪除失敗 → 改用 RollingFileAppender 或 Log4j 2.x
  • 效能:%l、%M、%L 需建立堆疊追蹤,高頻日誌請移除
  • 遷移建議:新專案請直接使用 Log4j 2.x (非同步日誌、Garbage-Free、Rich 配置、自動重載)

Log4j 2.x 同等配置片段 (參考)

<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 多檔案隔離、動態路徑、加載項控制的完整實務知識,可直接應用於專案日誌架構設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved