Log4j 是 Apache 基金會經典的 Java 日誌框架,憑藉靈活配置、多輸出目標、分級控制、高性能等特性,長期佔據 Java 日誌領域統治地位。雖然 Log4j 2.x 和 SLF4J+Logback 逐漸成為主流,但理解 Log4j 1.x 核心機制對維護老項目、掌握日誌框架設計思想極有價值。
| 組件 | 職責 | 核心實現類 |
|---|---|---|
| Logger(記錄器) | 日誌記錄入口,提供 debug/info/warn/error/fatal 等級方法 | org.apache.log4j.Logger |
| Appender(輸出源) | 控制日誌輸出目的地(控制台、文件、數據庫、Socket、郵件等) | ConsoleAppender, FileAppender, RollingFileAppender, DailyRollingFileAppender, JDBCAppender, SMTPAppender... |
| Layout(佈局器) | 定義日誌輸出格式(模式、HTML、XML、自定義) | PatternLayout, HTMLLayout, XMLLayout, SimpleLayout... |
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
### 根 Logger 配置:級別 DEBUG,掛載兩個 Appender
log4j.rootLogger=DEBUG, console, file
### ConsoleAppender:控制台輸出
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} [%t] %-5p %c - %m%n
### FileAppender:文件輸出(帶滾動)
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logs/app.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n
import org.apache.log4j.Logger;
public class Log4jDemo {
private static final Logger logger = Logger.getLogger(Log4jDemo.class);
public static void main(String[] args) {
logger.debug("調試信息:進入主方法");
logger.info("業務信息:用戶登錄成功");
logger.warn("警告信息:緩存命中率低於 50%");
logger.error("錯誤信息:數據庫連接失敗", new SQLException("Connection timeout"));
logger.fatal("致命錯誤:系統崩潰");
}
}
2024-01-15 10:30:45 [main] DEBUG Log4jDemo - 調試信息:進入主方法
2024-01-15 10:30:45 [main] INFO Log4jDemo - 業務信息:用戶登錄成功
2024-01-15 10:30:45 [main] WARN Log4jDemo - 警告信息:緩存命中率低於 50%
2024-01-15 10:30:45 [main] ERROR Log4jDemo - 錯誤信息:數據庫連接失敗
java.sql.SQLException: Connection timeout
at Log4jDemo.main(Log4jDemo.java:18)
2024-01-15 10:30:45 [main] FATAL Log4jDemo - 致命錯誤:系統崩潰
ConversionPattern 控制每條日誌的輸出格式,常用符號:
| 符號 | 含義 | 示例輸出 |
|---|---|---|
%d | 日期時間,可指定格式 %d{yyyy-MM-dd HH:mm:ss,SSS} | 2024-01-15 10:30:45,123 |
%t | 線程名 | main, http-nio-8080-exec-1 |
%p | 日誌級別 | DEBUG, INFO, WARN, ERROR, FATAL |
%c | Logger 名稱(通常為全類名) | com.example.service.UserService |
%m | 日誌消息 | 用戶登錄成功 |
%n | 換行符(跨平台) | \r\n (Win) / \n (Linux) |
%l | 調用位置(類.方法:行號) | com.example.UserService.login(UserService.java:25) |
%F | 文件名 | UserService.java |
%L | 行號 | 25 |
%% | 輸出 % 字符 | % |
格式修飾符:%20c(右對齊寬度 20)、%-20c(左對齊)、%.30c(截斷超長)。
使用 log4j-dev.properties、log4j-prod.properties,通過 JVM 參數 -Dlog4j.configuration=file:/path/to/log4j-prod.properties 或 Spring Profile 動態加載。
log4j.appender.async=org.apache.log4j.AsyncAppender
log4j.appender.async.BufferSize=512
log4j.appender.async.AppenderRef=file
log4j.rootLogger=DEBUG, async
private static final Logger logger = Logger.getLogger(Xxx.class); 避免重複創建。INFO 或 WARN,關鍵模塊單獨開 DEBUG:log4j.logger.com.example.core=DEBUGlogger.debug("用戶 {} 登錄, IP: {}", username, ip);(需 SLF4J 門面支撐)。logger.error("操作失敗", e); 而非 logger.error("操作失敗: " + e.getMessage());下篇將深入講解 Log4j 進階配置詳解:多 Appender 組合、自定義 Layout、JDBCAppender 入庫、SMTPAppender 郵件告警、Log Factor 5 可視化分析、以及遷移到 Log4j 2.x / SLF4J+Logback 的最佳路徑。