Apache Log4j 是 Java 生態系中最經典的日誌框架,通過靈活的配置文件實現日誌輸出的目的地、格式、級別控制,無需修改業務代碼。本文系統介紹 Log4j 核心架構、配置語法與實戰應用模式。
獲取 Logger 實例的兩種方式:
Logger.getRootLogger():獲取根記錄器Logger.getLogger(String name):獲取命名記錄器(通常傳入類名)關鍵特性:同名獲取返回同一實例,即 Logger.getLogger("wombat") 多次調用返回同一物件引用。
DEBUG < INFO < WARN < ERROR < FATAL
Logger 提供對應方法:debug()、info()、warn()、error()、fatal(),以及通用 log(Level level, Object message)。
BasicConfigurator(簡單控制台)、PropertyConfigurator(屬性文件)、DOMConfigurator(XML)。推薦 PropertyConfigurator.configure("log4j.properties")。import org.apache.log4j.Logger;private static Logger log = Logger.getLogger(MyClass.class);log.debug("訊息"); log.info("訊息"); ...注意:初始化僅在應用啟動時執行一次,重複初始化會浪費資源,且舊版本配合 DailyRollingFileAppender 可能導致問題。
log4j.rootLogger=INFO, stdout, R
INFO:根級別閾值,低於 INFO 的日誌(如 DEBUG)將被過濾stdout, R:輸出目的地(Appender)名稱,可指定多個log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log4j.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.TTCCLayout
| 類型 | 用途 |
|---|---|
| ConsoleAppender | 控制台輸出 |
| FileAppender | 文件輸出 |
| RollingFileAppender | 按文件大小滾動備份 |
| DailyRollingFileAppender | 按日期滾動備份 |
| JDBCAppender | 寫入資料庫 |
| 類型 | 特點 |
|---|---|
| PatternLayout | 靈活模式定義(最常用) |
| SimpleLayout | 級別 + 訊息 |
| TTCCLayout | 時間、線程、類別等詳細資訊 |
| HTMLLayout | HTML 表格格式 |
%p - 日誌級別
%t - 線程名
%F - 檔案名
%L - 行號
%m - 日誌訊息
%n - 換行符
%d{yyyy-MM-dd HH:mm:ss} - 時間格式
%c - Logger 名稱(類全名)
import org.apache.log4j.Logger;
public class Test {
static Logger log = Logger.getLogger(Test.class);
public void log() {
log.debug("Debug info.");
log.info("Info info");
log.warn("Warn info");
log.error("Error info");
log.fatal("Fatal info");
}
public static void main(String[] args) {
new Test().log();
}
}
log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
INFO [main] (Test.java:16) - Info info
WARN [main] (Test.java:17) - Warn info
ERROR [main] (Test.java:18) - Error info
FATAL [main] (Test.java:19) - Fatal info
分析:根級別設為 info,因此 debug 級別日誌被過濾。Logger 名稱傳入 Test.class 實際為完整類名 test.Test,若存在父 Logger test 則繼承其配置,否則繼承 rootLogger。
private static final Logger LOG = Logger.getLogger(MyClass.class);INFO 或 WARN,開發/測試環境可用 DEBUGRollingFileAppender 限制文件大小與備份數量,防止磁盤佔滿INFO 記錄關鍵節點,異常處理使用 ERROR 並附帶堆棧追蹤DEBUG 日誌,影響性能Log4j 雖已有 Log4j 2.x 版本,但 1.x 架構設計思想仍具參考價值,理解其核心機制有助於掌握現代日誌框架(SLF4J、Logback、Log4j2)的共同原理。