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

Log4J 實戰速成:配置檔案、程式碼整合與輸出層級控制完整範例

     編輯:Java 相關知識

前言

Log4J 是 Java 事實標準日誌框架,核心三大組件:**Logger (記錄器)、Appender (輸出目的地)、Layout (格式化)**。本文以 .properties 配置為例,示範從依賴引入到多層級輸出控制的完整流程。

1. 依賴引入

  • Maven: <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>
  • 手動:將 log4j-1.2.17.jar 放入 Classpath (如 WEB-INF/lib)。

2. 配置檔 log.properties

# === Root Logger ===
log4j.rootLogger=WARN, console

# === 特定 Logger 層級覆蓋 ===
log4j.logger.first=ERROR, console
log4j.logger.first.second=INFO, console

# === Appender 定義 ===
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

# 進階:PatternLayout 自訂格式
# log4j.appender.console.layout=org.apache.log4j.PatternLayout
# log4j.appender.console.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{2} - %m%n

# 檔案輸出範例 (RollingFileAppender)
# log4j.appender.file=org.apache.log4j.RollingFileAppender
# log4j.appender.file.File=logs/app.log
# log4j.appender.file.MaxFileSize=10MB
# log4j.appender.file.MaxBackupIndex=5
# log4j.appender.file.layout=org.apache.log4j.PatternLayout
# log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n

配置關鍵點解析

設定含義
log4j.rootLogger=WARN, console根記錄器預設輸出 WARN 以上 (WARN, ERROR, FATAL) 至 console
log4j.logger.first=ERROR, console名為 first 的 Logger 及其子孫預設 ERROR 以上
log4j.logger.first.second=INFO, console子記錄器 first.second 獨立設為 INFO 以上 (DEBUG 仍被過濾)
SimpleLayout輸出格式:級別 - 訊息 (如 WARN - root warn)

3. Java 程式碼整合

package log;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class JustLog4j {
    // 靜態取得 Logger 實例,名稱對應配置檔層級
    private static final Logger rootLogger = Logger.getRootLogger();
    private static final Logger firstLogger = Logger.getLogger("first");
    private static final Logger secondLogger = Logger.getLogger("first.second");

    public static void main(String[] args) {
        System.out.println("start");
        // 載入配置 (僅需一次,通常放在 ServletContextListener 或 Spring 初始化)
        PropertyConfigurator.configure("log.properties");

        // === Root Logger 測試 ===
        rootLogger.debug("root debug");   // 不輸出 (低於 WARN)
        rootLogger.info("root info");     // 不輸出
        rootLogger.warn("root warn");     // 輸出
        rootLogger.error("root error");   // 輸出
        rootLogger.fatal("root fatal");   // 輸出

        // === first Logger 測試 (ERROR 以上) ===
        firstLogger.debug("first debug"); // 不輸出
        firstLogger.info("first info");   // 不輸出
        firstLogger.warn("first warn");   // 不輸出 (低於 ERROR)
        firstLogger.error("first error"); // 輸出 (兩次,因配置有兩個 appender? 實為範例重複)
        firstLogger.fatal("first fatal"); // 輸出

        // === first.second Logger 測試 (INFO 以上) ===
        secondLogger.debug("second debug"); // 不輸出
        secondLogger.info("second info");   // 輸出 (三次)
        secondLogger.warn("second warn");   // 輸出 (三次)
        secondLogger.error("second error"); // 輸出 (三次)
        secondLogger.fatal("second fatal"); // 輸出 (三次)

        System.out.println("end");
    }
}

4. 執行輸出結果

start
WARN - root warn
ERROR - root error
FATAL - root fatal
ERROR - firstLogger error
ERROR - firstLogger error
FATAL - firstLogger fatal
FATAL - firstLogger fatal
INFO - secondLogger info
INFO - secondLogger info
INFO - secondLogger info
WARN - secondLogger warn
WARN - secondLogger warn
WARN - secondLogger warn
ERROR - secondLogger error
ERROR - secondLogger error
ERROR - secondLogger error
FATAL - secondLogger fatal
FATAL - secondLogger fatal
FATAL - secondLogger fatal
end

5. 進階技巧與遷移建議

  • XML 配置:log4j.xml 支援更豐富設定 (Filter, ErrorHandler, AsyncAppender),生產環境建議使用。
  • SLF4J + Logback:Log4J 1.x 已進入維護模式,新專案建議直接採用 Logback (Log4J 原作者重寫,效能更強、原生支援 SLF4J、配置熱重載)。
  • MDC/NDC:多執行緒環境下用 MDC.put("requestId", UUID.randomUUID().toString()) 注入追蹤 ID,PatternLayout 使用 %X{requestId} 輸出,實現全鏈路日誌關聯。
  • 非同步日誌:高併發系統啟用 AsyncAppender 或 Logback <async>,將 I/O 移出業務執行緒。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved