每個應用程式都需要與外部世界溝通、收集執行數據。雖然資料庫、API 介面都是選項,但純文字日誌檔案仍是最直觀、最低成本的除錯與審計手段。它不需要額外基礎設施,卻能完整重現系統行為軌跡。
com.example.module),支援繼承關係。DEBUG < INFO < WARN < ERROR < FATAL
設定 Logger 優先級為 WARN 時,DEBUG 和 INFO 訊息將被忽略。這能在生產環境大幅減少 I/O 開銷。
# 根 Logger 設定:DEBUG 等級,掛載三個 Appender
log4j.rootLogger=DEBUG, A1, A2, A3
# A1: Console 輸出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p %d %t %m%n
# A2: 滾動檔案(依大小切割)
log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=logs/app.log
log4j.appender.A2.MaxFileSize=10MB
log4j.appender.A2.MaxBackupIndex=10
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c - %m%n
# A3: UDP 廣播(適合即時監控工具接收)
log4j.appender.A3=org.apache.log4j.net.SyslogAppender
log4j.appender.A3.SyslogHost=localhost
log4j.appender.A3.Facility=LOCAL7
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=%-5p %c - %m%n
| 符號 | 含義 | 範例輸出 |
|---|---|---|
%p | 優先級 | DEBUG |
%d | 日期時間 | 2024-05-15 14:30:00,123 |
%t | 執行緒名稱 | main |
%c | Logger 名稱(類別全名) | com.example.Service |
%m | 訊息內容 | User logged in |
%n | 平台換行符 | \n 或 \r\n |
%L | 行號(慎用,效能影響大) | 42 |
import org.apache.log4j.PropertyConfigurator;
public class AppInit {
public static void initLogging() {
// 路徑建議放在 classpath 根目錄或絕對路徑
PropertyConfigurator.configure("config/log4j.properties");
}
}
import org.apache.log4j.Logger;
public class OrderService {
private static final Logger log = Logger.getLogger(OrderService.class);
public void createOrder(Order order) {
log.info("建立訂單: " + order.getId());
// ...
}
}
// 基本用法
log.debug("訂單詳細資料: " + order.toString()); // 即使 DEBUG 關閉,字串仍會組裝
// 進階用法:效能優化
if (log.isDebugEnabled()) {
log.debug("訂單詳細資料: " + expensiveToString(order)); // 只有開啟 DEBUG 才執行
}
// 記錄例外堆疊(關鍵!)
try {
// risky operation
} catch (Exception e) {
log.error("處理訂單失敗", e); // 完整堆疊會寫入日誌
}
com.example.payment、com.example.warehouse)設定不同等級與 Appender。INFO 或 WARN,問題時動態調整(Log4j 2 支援 JMX 熱修改)。AsyncAppender,避免日誌 I/O 阻塞業務執行緒。請務必升級至 Log4j 2.x 或改用 SLF4J + Logback。Log4j 2 提供:
log.debug(() -> expensiveOp()))Log4Shell (CVE-2021-44228) 安全漏洞