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

Log4j 2 完整配置指南:從核心組件到多輸出目標實戰

     編輯:Java 相關知識

前言

Apache Log4j 2 是 Java 生態系中最廣泛使用的日誌框架之一。本文系統梳理 Log4j 的三大核心組件——Logger(日誌記錄器)、Appender(輸出目的地)、Layout(輸出格式)的協作關係,詳細說明 XML 與 Properties 兩種配置文件語法,並通過完整代碼示例演示:程式碼式配置、配置文件驅動、單日誌多重輸出(控制台、滾動文件、資料庫)、以及效能優化最佳實踐。

核心組件架構

  • Logger:日誌記錄的入口,負責級別過濾(ERROR > WARN > INFO > DEBUG),獲取方式 Logger.getLogger(Class)。
  • Appender:決定日誌「去哪兒」。常見實現:ConsoleAppender、RollingFileAppender(按大小/時間滾動)、JDBCAppender(寫入資料庫)。
  • Layout:決定日誌「長什麼樣」。PatternLayout 最靈活,支援 %d 時間、%p 級別、%c 類名、%m 訊息、%n 換行等佔位符。

配置文件語法詳解

Properties 格式關鍵配置項

# 根 Logger:級別 + 多個 Appender 名稱
log4j.rootLogger = INFO, A1, A2, A3

# Appender A1:控制台
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %4p [%t] (%F:%L) - %m%n

# Appender A2:滾動文件(1KB 滾動,保留 3 份備份)
log4j.appender.A2 = org.apache.log4j.RollingFileAppender
log4j.appender.A2.File = ./log/sysLog.log
log4j.appender.A2.MaxFileSize = 1KB
log4j.appender.A2.MaxBackupIndex = 3
log4j.appender.A2.layout = org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}:%p %t %c - %m%n

# Appender A3:資料庫
log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL = jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver = com.mysql.jdbc.Driver
log4j.appender.A3.user = root
log4j.appender.A3.password = root
log4j.appender.A3.layout = org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern = INSERT INTO tb_log(createDate,thread,level,class,message) values('%d','%t','%-5p','%c','%m')

XML 格式對應配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="https://jakarta.apache.org/log4j/">
    <appender name="appender1" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="logfile08.html" />
        <param name="MaxFileSize" value="1MB" />
        <param name="MaxBackupIndex" value="5" />
        <layout class="org.apache.log4j.HTMLLayout" />
    </appender>
    <root>
        <level value="debug" />
        <appender-ref ref="appender1" />
    </root>
</log4j:configuration>

程式碼中使用 Log4j

三步驟快速上手

  1. 獲取 Logger:static Logger logger = Logger.getLogger(MyClass.class);
  2. 載入配置:
    • BasicConfigurator.configure() —— 快速預設配置(僅控制台)。
    • PropertyConfigurator.configure("path/log4j.properties") —— 載入 Properties 文件。
    • DOMConfigurator.configure("path/log4j.xml") —— 載入 XML 文件。
  3. 記錄日誌:logger.info("訊息")、logger.debug("訊息") 等。

效能優化:啟用檢查再記錄

if (logger.isDebugEnabled()) {
    logger.debug("昂貴的調試訊息構建: " + expensiveComputation());
}

避免在日誌級別未啟用時仍執行字符串拼接或複雜計算。

實戰案例:單日誌同時輸出到控制台、文件、資料庫

資料庫表結構

CREATE DATABASE db_log4j;
USE db_log4j;
CREATE TABLE tb_log (
    logId INT NOT NULL AUTO_INCREMENT COMMENT '流水號',
    createDate VARCHAR(45) DEFAULT NULL COMMENT '日誌生成時間',
    thread VARCHAR(45) DEFAULT NULL COMMENT '執行緒',
    level VARCHAR(45) DEFAULT NULL COMMENT '日誌級別',
    class VARCHAR(45) DEFAULT NULL COMMENT '生成日誌的類',
    message VARCHAR(245) DEFAULT NULL COMMENT '日誌詳細訊息',
    PRIMARY KEY (logId)
);

測試類 Log4jPrintByConfigure

package org.demo.log4j.dennisit;

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

public class Log4jPrintByConfigure {
    private static Logger logger = Logger.getLogger(Log4jPrintByConfigure.class);

    public static void main(String[] args) throws Exception {
        PropertyConfigurator.configure("configure/log4j.properties");
        logger.debug("logger print DEBUG message");
        logger.info("logger print INFO message");
        logger.warn("logger print WARN message");
        logger.error("logger print ERROR message");
        logger.fatal("Here is FATAL message");
    }
}

執行後,控制台、./log/sysLog.log、資料表 tb_log 將同時收到對應級別的日誌記錄。

進階技巧:分層日誌路由

若專案採用分層架構,可建立基類 BaseDao、BaseService、BaseAction,各自持有獨立 Logger 並配置不同 Appender,實現 DAO 層日誌寫入 dao.log、Service 層寫入 service.log 等,便於問題排查與審計。

總結

Log4j 以「Logger-Appender-Layout」三層解耦設計,支援極其靈活的日誌路由與格式化。掌握 PatternLayout 佔位符語法、滾動文件策略、JDBCAppender 參數化 SQL,並養成「先檢查級別再構建訊息」的習慣,即可在生產環境構建高效、可維護的日誌體系。

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