| 組件 | 職責 | 關鍵點 |
|---|---|---|
| Logger | 日志記錄器,應用調用入口 | 層次結構:Root Logger → 子 Logger(按名稱繼承),Logger.getLogger(Class) 獲取 |
| Appender | 輸出目的地 | Console、File、RollingFile、DailyRollingFile、JDBC、Syslog、Socket、JMS 等,一個 Logger 可掛多個 Appender |
| Layout | 輸出格式化 | PatternLayout(最靈活)、HTMLLayout、SimpleLayout、TTCCLayout,控制時間、級別、類名、行號、線程、消息等字段 |
DEBUG < INFO < WARN < ERROR < FATAL
配置級別為閾值,**只有 ≥ 閾值的日志才會輸出**,動態調整無需改代碼。
# 根 Logger:DEBUG 級別,輸出到控制台 和 滾動文件
log4j.rootLogger=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
# 滾動文件 Appender
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
log4j.rootLogger=[level], appender1, appender2, ...log4j.appender.=fully.qualified.ClassName log4j.appender.. log4j.appender..layout=fully.qualified.LayoutClass log4j.appender..layout.ConversionPattern=pattern | Appender | 適用場景 | 關鍵參數 |
|---|---|---|
| ConsoleAppender | 開發調試、容器標準輸出 | target=System.out/err |
| FileAppender | 簡單文件輸出 | File、Append |
| RollingFileAppender | 按大小滾動,生產常用 | MaxFileSize、MaxBackupIndex |
| DailyRollingFileAppender | 按日期滾動 | DatePattern (如 '.'yyyy-MM-dd) |
| JDBCAppender | 寫入數據庫 | DataSource、SQL、參數映射 |
| AsyncAppender | 高吞吐異步寫入(包裝其他 Appender) | BufferSize、Blocking |
| 符號 | 含義 | 示例輸出 |
|---|---|---|
%m | 日志消息 | User login |
%p | 級別 | DEBUG |
%r | 啟動以來毫秒數 | 12345 |
%c | Logger 名稱 (通常為全類名) | com.example.Service |
%t | 線程名 | http-nio-8080-exec-1 |
%n | 換行符 (跨平台) | \r\n / \n |
%d | 時間,可指定格式 | %d{yyyy-MM-dd HH:mm:ss,SSS} → 2024-01-15 14:30:45,123 |
%l | 調用位置 (類.方法:行) | com.example.Service.login(Service.java:42) |
%F | 文件名 | Service.java |
%L | 行號 | 42 |
%M | 方法名 | login |
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version> <!-- 或 2.x 版本 -->
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
import org.apache.log4j.Logger;
public class MyApp {
private static final Logger logger = Logger.getLogger(MyApp.class);
public static void main(String[] args) {
// 可選:手動加載配置 (通常由框架自動加載 classpath 下的 log4j.properties)
// PropertyConfigurator.configure("log4j.properties");
logger.debug("Debug message");
logger.info("Info message");
logger.warn("Warn message");
logger.error("Error message", new RuntimeException("Something failed"));
logger.fatal("Fatal message");
}
}
AsyncAppender 避免日志阻塞業務線程logging.config、K8s ConfigMap 掛載,環境隔離%l/%F/%L:高併發下獲取堆疊信息性能損耗大,僅調試環境開啟log4j-api (介面) + log4j-core (實現)log4j2.xml/.json/.yaml,語法更強大logger.debug(() -> expensiveComputation())Log4j 以「Logger-Appender-Layout」解耑架構、靈活配置、豐富生態,成為 Java 日志事實標準。掌握核心組件關係、PatternLayout 語法、Appender 選型、生產調優原則,即可構建高性能、可觀測、易維護的日志體系。