跳至主要内容

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.xLog4j 2.x差異與說明
效能核心同步 logging使用 LMAX Disruptor 高效非同步核心Log4j 2 的 AsyncAppender 預設支援非同步,多執行緒下性能顯著提升
架構物件導向但單一類型擴展Plugin 架構,模組化設計
(Appender/Filter/Layout 可插拔)
使用 @Plugin 註解即可擴充自訂組件
設定檔支援.properties / .xml.properties / .xml / .json / .yaml更彈性,支援 JSON/YAML,且支援熱載入
執行緒MDC / NDCThreadContext(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 行為