Apache Log4j 2 是 Java 生態系中最廣泛使用的日誌框架之一。本文系統梳理 Log4j 的三大核心組件——Logger(日誌記錄器)、Appender(輸出目的地)、Layout(輸出格式)的協作關係,詳細說明 XML 與 Properties 兩種配置文件語法,並通過完整代碼示例演示:程式碼式配置、配置文件驅動、單日誌多重輸出(控制台、滾動文件、資料庫)、以及效能優化最佳實踐。
Logger.getLogger(Class)。ConsoleAppender、RollingFileAppender(按大小/時間滾動)、JDBCAppender(寫入資料庫)。PatternLayout 最靈活,支援 %d 時間、%p 級別、%c 類名、%m 訊息、%n 換行等佔位符。# 根 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 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>
static Logger logger = Logger.getLogger(MyClass.class);BasicConfigurator.configure() —— 快速預設配置(僅控制台)。PropertyConfigurator.configure("path/log4j.properties") —— 載入 Properties 文件。DOMConfigurator.configure("path/log4j.xml") —— 載入 XML 文件。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)
);
Log4jPrintByConfigurepackage 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,並養成「先檢查級別再構建訊息」的習慣,即可在生產環境構建高效、可維護的日誌體系。