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

Log4j 與 Commons Logging 整合最佳實踐:門面模式解耦日誌實現

     編輯:Java 綜合教學

Log4j 與 Commons Logging 整合最佳實踐:門面模式解耦日誌實現

Commons Logging (JCL) 作為日誌門面,Log4j 作為具體實現,兩者結合實現「代碼依賴門面、運行時綁定實現」的解耦架構。本文詳解整合原理、配置模板與最佳實踐。

一、為什麼要同時使用 JCL + Log4j?

  • 解耦:業務代碼只依賴 JCL API,不直接依賴 Log4j,便於日後切換為 Logback、SLF4J 等。
  • 自動發現:JCL 啟動時按優先級自動檢測 classpath 中的日誌實現:
    1. commons-logging.properties 指定實現類
    2. 系統屬性 org.apache.commons.logging.Log
    3. 發現 Log4j Jar → 自動綁定 Log4j
    4. JDK 1.4+ java.util.logging
    5. 內建 SimpleLog(功能極弱)
  • 零配置整合:只需將 log4j.jar 放入 classpath,JCL 即自動使用 Log4j,無需額外配置。

二、代碼中正確使用 JCL API

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class UserService {
    // 靜態實例,避免重複創建
    private static final Log log = LogFactory.getLog(UserService.class);

    public void register(User user) {
        log.debug("開始註冊用戶: " + user.getName());
        // ... 業務邏輯
        log.info("用戶註冊成功, ID: " + user.getId());
        if (user.getEmail() == null) {
            log.warn("用戶未填寫郵箱");
        }
    }
}

關鍵點:

  • 使用 LogFactory.getLog(當前類.class) 而非 getLog(this.getClass())(靜態上下文無 this)。
  • 日誌級別由低到高:DEBUG < INFO < WARN < ERROR < FATAL。

三、log4j.properties 核心配置詳解

### 根記錄器:級別 + 輸出目的地(多個用逗號分隔)
log4j.rootLogger = DEBUG, CONSOLE, FILE, ROLLING_FILE

### 控制台輸出
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
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}] [%p] [%c] - %m%n

### 固定文件輸出
log4j.appender.FILE = org.apache.log4j.FileAppender
log4j.appender.FILE.File = logs/app.log
log4j.appender.FILE.Append = true
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = [%d] [%p] [%c] - %m%n

### 滾動文件(按大小/備份數)
log4j.appender.ROLLING_FILE = org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.File = logs/app-rolling.log
log4j.appender.ROLLING_FILE.MaxFileSize = 10MB
log4j.appender.ROLLING_FILE.MaxBackupIndex = 10
log4j.appender.ROLLING_FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern = [%d] [%p] [%c] - %m%n

### 按天滾動(DailyRollingFileAppender)
log4j.appender.DAILY = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAILY.File = logs/app-daily.log
log4j.appender.DAILY.DatePattern = '.'yyyy-MM-dd
log4j.appender.DAILY.layout = org.apache.log4j.PatternLayout
log4j.appender.DAILY.layout.ConversionPattern = [%d] [%p] [%c] - %m%n

### 郵件通知(僅 ERROR/FATAL)
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold = ERROR
log4j.appender.MAIL.BufferSize = 10
log4j.appender.MAIL.From = app@company.com
log4j.appender.MAIL.SMTPHost = smtp.company.com
log4j.appender.MAIL.Subject = 【生產告警】%c - %m
log4j.appender.MAIL.To = ops@company.com
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern = [%d] [%p] [%c] - %m%n

四、級別過濾機制

  • rootLogger 級別為全局閾值(如 DEBUG 允許所有級別通過)。
  • 各 Appender 可設 Threshold 進一步過濾(如控制台 DEBUG、文件 INFO、郵件 ERROR)。
  • 代碼調用級別必須 ≥ rootLogger 級別 且 ≥ Appender Threshold 才會輸出。

五、文件輸出路徑最佳實踐

避免相對路徑(默認指向 Tomcat bin/ 目錄),建議用絕對路徑或相對 catalina.base:

log4j.appender.FILE.File = ${catalina.base}/logs/app.log

六、全局單例日誌工具類(可選)

public final class Logs {
    private static final Log LOG = LogFactory.getLog(Logs.class);
    private Logs() {}
    public static Log getLog() { return LOG; }
}

// 業務調用
Logs.getLog().info("業務開始");
Logs.getLog().error("業務異常", e);

集中管理日誌實例,便於統一級別控制與格式調整。

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