Log4j2 學習紀錄
這邊改用 log4j 2.x 版
相同情境改用 2.x 版語法設定
log4j 2.x 相關設定方式
-
情境請參考 Log4j 1.x 學習紀錄
-
設定範例:
- package insect.totem.school.School;
- package insect.totem.school.classroom.ClassRoom;
- Root Logger 資料輸出到 console
- School 的資料只輸出到 file
- ClassRoom 的資料只輸出到 email
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<!-- Console Appender -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n"/>
</Console>
<!-- File Appender for School -->
<RollingFile name="SchoolFile" fileName="logs/school.log"
filePattern="logs/school-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1MB"/>
</Policies>
<DefaultRolloverStrategy max="3"/>
</RollingFile>
<!-- SMTP Appender for ClassRoom -->
<SMTP name="MailAppender"
subject="Log4j2 Error in ClassRoom"
to="admin@example.com"
from="your_email@example.com"
smtpHost="smtp.example.com"
smtpUsername="your_email@example.com"
smtpPassword="your_password"
bufferSize="512"
smtpProtocol="smtp"
smtpPort="25">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n"/>
</SMTP>
</Appenders>
<Loggers>
<!-- Logger for School -->
<Logger name="insect.totem.school.School" level="debug" additivity="false">
<AppenderRef ref="SchoolFile"/>
</Logger>
<!-- Logger for ClassRoom -->
<Logger name="insect.totem.school.classroom.ClassRoom" level="error" additivity="false">
<AppenderRef ref="MailAppender"/>
</Logger>
<!-- Root Logger -->
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
log4j2.properties
status = WARN
name = PropertiesConfig
# ===== Appenders =====
appender.console.type = Console
appender.console.name = Console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n
appender.school.type = RollingFile
appender.school.name = SchoolFile
appender.school.fileName = logs/school.log
appender.school.filePattern = logs/school-%d{yyyy-MM-dd}-%i.log.gz
appender.school.layout.type = PatternLayout
appender.school.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n
appender.school.policies.type = Policies
appender.school.policies.size.type = SizeBasedTriggeringPolicy
appender.school.policies.size.size = 1MB
appender.school.strategy.type = DefaultRolloverStrategy
appender.school.strategy.max = 3
appender.mail.type = SMTP
appender.mail.name = MailAppender
appender.mail.subject = Log4j2 Error in ClassRoom
appender.mail.to = admin@example.com
appender.mail.from = your_email@example.com
appender.mail.smtpHost = smtp.example.com
appender.mail.smtpPort = 25
appender.mail.smtpProtocol = smtp
appender.mail.smtpUsername = your_email@example.com
appender.mail.smtpPassword = your_password
appender.mail.bufferSize = 512
appender.mail.layout.type = PatternLayout
appender.mail.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n
# ===== Loggers =====
logger.school.name = insect.totem.school.School
logger.school.level = debug
logger.school.additivity = false
logger.school.appenderRefs = school
logger.school.appenderRef.school.ref = SchoolFile
logger.classroom.name = insect.totem.school.classroom.ClassRoom
logger.classroom.level = error
logger.classroom.additivity = false
logger.classroom.appenderRefs = mail
logger.classroom.appenderRef.mail.ref = MailAppender
# ===== Root Logger =====
rootLogger.level = info
rootLogger.appenderRefs = console
rootLogger.appenderRef.console.ref = Console
Log4j 與 log4j2 主要差異
- 這邊整理網路上 Log4j 與 log4j2 間主要差異
分類 | Log4j 1.x | Log4j 2.x | 差異與說明 |
---|---|---|---|
效能核心 | 同步 logging | 使用 LMAX Disruptor 高效非同步核心 | Log4j 2 的 AsyncAppender 預設支援非同步,多執行緒下性能顯著提升 |
架構 | 物件導向但單一類型擴展 | Plugin 架構,模組化設計 (Appender/Filter/Layout 可插拔) | 使用 @Plugin 註解即可擴充自訂組件 |
設定檔支援 | .properties / .xml | .properties / .xml / .json / .yaml | 更彈性,支援 JSON/YAML,且支援熱載入 |
執行緒 | MDC / NDC | ThreadContext(Map / Stack) | 支援 Map 與 Stack(比 MDC/NDC 更彈性), 可跨執行緒傳遞 context |
過濾機制 | 僅 Logger 設等級 | Logger、Appender、Marker、ThreadContext 皆可過濾 | 支援複雜條件組合與過濾器 (如 RegexFilter、ScriptFilter) |
非同步 | 需使用 AsyncAppender | 原生支援 Disruptor-based AsyncLoggers(效能最佳) | 在大流量 log 場景(如金融、物聯網) 可明顯降低延遲 |
延遲處理 | 不支援 | 支援 lambda 延遲 log 評估 | 如 logger.debug(() -> "expensive msg") ,不執行無意義建構 |
設定重載 | 手動重啟 | 支援自動偵測設定檔變更並重新載入 | 增加彈性與運維便利性 |
安全漏洞 | 重大漏洞 如 Log4Shell | Log4j 2.16+ 修復漏洞並改良 JNDI 行為 |