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

Log4j 按日誌級別分離輸出到不同檔案完整配置

     編輯:Java 相關知識

配置目標

實現日誌級別分離存儲:DEBUG/INFO/WARN/ERROR 各自寫入對應檔案,同時控制檔案大小、備份數量、滾動策略,滿足生產環境運維需求。

完整 log4j.properties 配置

# 根記錄器:設定最低級別與輸出目的地
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

Java 代碼中使用

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 2.x 遷移配置

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>

運維最佳實踐

  1. 目錄權限:確保應用使用者對 /var/log/myapp 有寫入權限。
  2. 磁碟監控:設定磁碟使用率告警(> 80%),防止日誌佔滿磁碟導致應用掛起。
  3. 日誌收集:配合 Filebeat/Fluentd 採集至 ELK/EFK,實現集中檢索與告警。
  4. 敏感資料脫敏:PatternLayout 中避免直接輸出密碼、Token、身分證號等敏感欄位。
  5. 非同步輸出:高併發場景使用 AsyncAppender 或 Log4j2 非同步記錄器,減少 I/O 阻塞業務線程。

總結

按級別分離日誌檔案是生產環境標準配置。Log4j 1.x 透過多 Appender + Threshold 實現,Log4j 2.x 則用 Filter 機制更優雅。核心原則:分級存儲、按天滾動、限制大小與備份、關閉累加性、非同步輸出,構建可觀測、可維運的日誌體系。

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