Apache Log4j 2 是新一代高效能日誌框架,支援非同步記錄、自動重載、豐富的 Appender 與 Layout。本文涵蓋配置文件結構、核心組件、Spring 整合、Web 容器初始化、分包級別控制與生產環境調優參數。
ScriptFilter、JDBCAppender 複雜參數)。<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30"> <!-- 自動重載間隔秒 -->
<Properties>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
<Property name="LOG_DIR">${sys:catalina.base}/logs</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<RollingFile name="RollingFile" fileName="${LOG_DIR}/app.log"
filePattern="${LOG_DIR}/app-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 每日滾動 -->
<SizeBasedTriggeringPolicy size="100 MB"/> <!-- 或達 100MB 滾動 -->
</Policies>
<DefaultRolloverStrategy max="30"/> <!-- 保留 30 檔 -->
</RollingFile>
<Async name="AsyncFile"> <!-- 非同步包裝,提升吞吐 -->
<AppenderRef ref="RollingFile"/>
</Async>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="AsyncFile"/>
</Root>
<Logger name="com.example.business" level="DEBUG" additivity="false">
<AppenderRef ref="AsyncFile"/>
</Logger>
<Logger name="org.springframework" level="WARN"/>
<Logger name="org.hibernate.SQL" level="DEBUG"/>
</Loggers>
</Configuration>
| 組件 | 角色 | 常用實作 |
|---|---|---|
| Logger | 日誌記錄入口,按名稱分層 | LogManager.getLogger() |
| Appender | 輸出目的地 | Console、RollingFile、Socket、Kafka、JDBC、Syslog |
| Layout | 格式化輸出內容 | PatternLayout、JsonLayout、XmlLayout、GelfLayout |
| Filter | 過濾/修改事件 | ThresholdFilter、MarkerFilter、ScriptFilter、BurstFilter |
| Policy/Strategy | RollingFile 滾動規則 | TimeBased、SizeBased、Cron、DefaultRolloverStrategy |
spring-boot-starter-log4j2(自動排除 Logback)。log4j2.xml 放在 src/main/resources。application.yml 可覆寫路徑:logging.config: classpath:log4j2-prod.xml。<!-- web.xml -->
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/log4j2.xml</param-value>
</context-param>
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
| 參數 | 建議值 | 說明 |
|---|---|---|
monitorInterval | 30~60 | 配置熱重載間隔,0 關閉 |
AsyncLogger / AsyncAppender | 啟用 | 非同步記錄,降低業務執行緒阻塞;需加 disruptor 依賴 |
bufferSize (AsyncAppender) | 8192~65536 | 環狀緩衝區大小,爆滿時預設阻塞,可設 blocking=false 丟棄 |
immediateFlush (FileAppender) | false | 關閉即時刷盤,靠 OS 頁面快取批量寫入,極大提升 IOPS |
DefaultRolloverStrategy.max | 30~90 | 保留檔案數,防止磁碟塞滿 |
PatternLayout.disableAnsi | true | 生產關閉 ANSI 色碼,減少輸出體積 |
additivity="false" 避免向 Root 傳遞導致雙倍輸出。LogManager.shutdown()(ServletContextListener 執行)。LogManager.shutdown() 刷緩衝區;或設 shutdownHook="disable" 自行管理。includeMdc="true" (AsyncAppender) 或使用 ThreadContext。org.apache.log4j → org.apache.logging.log4j。log4j-api (介面) + log4j-core (實作)。PropertyConfigurator 棄用,改用 Configurator.initialize() 或依賴自動發現。DailyRollingFileAppender → RollingFile + TimeBasedTriggeringPolicy。善用 Log4j 2 的非同步架構與豐富生態,能在高併發系統中實現「低延遲、高吞吐、可運維」的日誌觀測能力。