實現日誌級別分離存儲:DEBUG/INFO/WARN/ERROR 各自寫入對應檔案,同時控制檔案大小、備份數量、滾動策略,滿足生產環境運維需求。
# 根記錄器:設定最低級別與輸出目的地
log4j.rootLogger=DEBUG, stdout, fileInfo, fileDebug, fileWarn, fileError
# 控制台輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
# ===== INFO 級別專用檔案 =====
log4j.logger.infoLogger=INFO, fileInfo
log4j.additivity.infoLogger=false
log4j.appender.fileInfo=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileInfo.File=/var/log/myapp/info.log
log4j.appender.fileInfo.DatePattern='.'yyyy-MM-dd
log4j.appender.fileInfo.layout=org.apache.log4j.PatternLayout
log4j.appender.fileInfo.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %c - %m%n
log4j.appender.fileInfo.Threshold=INFO
log4j.appender.fileInfo.Append=true
log4j.appender.fileInfo.MaxFileSize=10MB
log4j.appender.fileInfo.MaxBackupIndex=30
# ===== DEBUG 級別專用檔案 =====
log4j.logger.debugLogger=DEBUG, fileDebug
log4j.additivity.debugLogger=false
log4j.appender.fileDebug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileDebug.File=/var/log/myapp/debug.log
log4j.appender.fileDebug.DatePattern='.'yyyy-MM-dd
log4j.appender.fileDebug.layout=org.apache.log4j.PatternLayout
log4j.appender.fileDebug.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %c - %m%n
log4j.appender.fileDebug.Threshold=DEBUG
log4j.appender.fileDebug.Append=true
log4j.appender.fileDebug.MaxFileSize=10MB
log4j.appender.fileDebug.MaxBackupIndex=30
# ===== WARN 級別專用檔案 =====
log4j.logger.warnLogger=WARN, fileWarn
log4j.additivity.warnLogger=false
log4j.appender.fileWarn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileWarn.File=/var/log/myapp/warn.log
log4j.appender.fileWarn.DatePattern='.'yyyy-MM-dd
log4j.appender.fileWarn.layout=org.apache.log4j.PatternLayout
log4j.appender.fileWarn.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %c - %m%n
log4j.appender.fileWarn.Threshold=WARN
log4j.appender.fileWarn.Append=true
log4j.appender.fileWarn.MaxFileSize=10MB
log4j.appender.fileWarn.MaxBackupIndex=30
# ===== ERROR 級別專用檔案 =====
log4j.logger.errorLogger=ERROR, fileError
log4j.additivity.errorLogger=false
log4j.appender.fileError=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileError.File=/var/log/myapp/error.log
log4j.appender.fileError.DatePattern='.'yyyy-MM-dd
log4j.appender.fileError.layout=org.apache.log4j.PatternLayout
log4j.appender.fileError.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %c - %m%n
log4j.appender.fileError.Threshold=ERROR
log4j.appender.fileError.Append=true
log4j.appender.fileError.MaxFileSize=10MB
log4j.appender.fileError.MaxBackupIndex=30
| 參數 | 說明 | 關鍵值 |
|---|---|---|
| Threshold | 過濾閾值,只記錄 ≥ 此級別的日誌 | INFO/DEBUG/WARN/ERROR |
| DatePattern | 按天滾動,生成 info.log.2024-01-15 等 | '.'yyyy-MM-dd |
| MaxFileSize | 單檔最大值,超過則滾動 | 10MB |
| MaxBackupIndex | 保留備份數量,超過刪除最舊 | 30 |
| additivity=false | 關閉累加性,避免重複輸出到父記錄器 | false |
| ConversionPattern | 日誌格式:時間、線程、級別、類別、訊息 | %-d{...} [%t:%r] - [%p] %c - %m%n |
import org.apache.log4j.Logger;
public class OrderService {
// 獲取對應級別的記錄器
private static final Logger infoLog = Logger.getLogger("infoLogger");
private static final Logger debugLog = Logger.getLogger("debugLogger");
private static final Logger warnLog = Logger.getLogger("warnLogger");
private static final Logger errorLog = Logger.getLogger("errorLogger");
public void processOrder(Order order) {
debugLog.debug("開始處理訂單: {}", order.getId());
infoLog.info("訂單 {} 狀態變更: {} -> {}", order.getId(), oldStatus, newStatus);
try {
paymentService.pay(order);
} catch (InsufficientBalanceException e) {
warnLog.warn("訂單 {} 餘額不足: {}", order.getId(), e.getMessage());
} catch (Exception e) {
errorLog.error("訂單 {} 處理失敗", order.getId(), e);
}
}
}
Log4j 1.x 已停止維護,建議遷移至 Log4j 2.x(log4j2.xml):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="InfoFile" fileName="/var/log/myapp/info.log"
filePattern="/var/log/myapp/info-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
<Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
</Appenders>
<Loggers>
<Root level="DEBUG">
<AppenderRef ref="Console"/>
<AppenderRef ref="InfoFile"/>
<AppenderRef ref="DebugFile"/>
<AppenderRef ref="WarnFile"/>
<AppenderRef ref="ErrorFile"/>
</Root>
</Loggers>
</Configuration>
/var/log/myapp 有寫入權限。AsyncAppender 或 Log4j2 非同步記錄器,減少 I/O 阻塞業務線程。按級別分離日誌檔案是生產環境標準配置。Log4j 1.x 透過多 Appender + Threshold 實現,Log4j 2.x 則用 Filter 機制更優雅。核心原則:分級存儲、按天滾動、限制大小與備份、關閉累加性、非同步輸出,構建可觀測、可維運的日誌體系。