首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Log4j 2.x 配置大全:從入門到高級多輸出、異步、郵件、數據庫、自定義 Appender

     編輯:Java 綜合教學

Log4j 2.x 配置大全:從入門到高級多輸出、異步、郵件、數據庫、自定義 Appender

本文基於 Log4j 1.x 經典配置(文中為 1.x 語法),梳理核心概念、配置結構、多場景實戰模式。新項目建議直接使用 Log4j 2.x(配置語法不同,性能更強、支持異步、GC-free)。

一、核心三要素

組件角色常用實現
Logger (記錄器)日誌產生入口,綁定類別名,層級過濾RootLogger、Named Logger
Appender (輸出端)決定日誌去向:控制台、文件、網絡、數據庫...ConsoleAppender、RollingFileAppender、JDBCAppender、SMTPAppender
Layout (佈局)決定日誌格式:文本、JSON、XML、HTML...PatternLayout、JSONLayout、HTMLLayout

二、基礎配置語法 (properties 格式)

# 根記錄器:級別 + Appender 引用
log4j.rootLogger=DEBUG, stdout, file, errorFile

# 控制台輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c:%L - %m%n

# 每日滾動文件(所有級別)
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=logs/app.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c:%L - %m%n

# 僅 ERROR 級別單獨文件(關鍵:Threshold 過濾)
log4j.appender.errorFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorFile.File=logs/error.log
log4j.appender.errorFile.Threshold=ERROR
log4j.appender.errorFile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c:%L - %m%n

三、PatternLayout 佔位符速查

四、高級場景實戰

1. 不同級別分文件(Threshold 過濾)

如上配置:同一 Logger 掛載多個 Appender,各自設 Threshold 實現級別路由。

2. 異步日誌(Log4j 2.x 核心優勢)

<!-- Log4j2.xml -->
<Appenders>
  <Async name="AsyncFile">
    <AppenderRef ref="RollingFile"/>
  </Async>
</Appenders>
<Loggers>
  <Root level="info"><AppenderRef ref="AsyncFile"/></Root>
</Loggers>

生產環境**強制啟用異步**,將 I/O 從業務線程剝離,延遲從 ms 降至 μs。

3. 郵件告警 (SMTPAppender)

log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From=alert@company.com
log4j.appender.mail.To=ops@company.com
log4j.appender.mail.SMTPHost=smtp.company.com
log4j.appender.mail.Subject=[ALERT] %c - %m
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=%d %p %c - %m%n

需引入 javax.mail.jar + activation.jar。

4. 數據庫存儲 (JDBCAppender)

log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.URL=jdbc:mysql://localhost:3306/logdb
log4j.appender.db.driver=com.mysql.jdbc.Driver
log4j.appender.db.user=root
log4j.appender.db.password=****
log4j.appender.db.sql=INSERT INTO logs (level, logger, message, time) VALUES ('%p', '%c', '%m', '%d')
log4j.appender.db.layout=org.apache.log4j.PatternLayout

高併發下建議**批量提交**或改用異步寫入,避免阻塞業務。

5. Windows 事件日志 (NTEventLogAppender)

# 需將 NTEventLogAppender.dll 放入 System32
log4j.appender.nt=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.nt.Source=MyApp
log4j.appender.nt.layout=org.apache.log4j.PatternLayout
log4j.appender.nt.layout.ConversionPattern=%p %c - %m

五、代碼中初始化

// 方式1:屬性文件(推薦)
PropertyConfigurator.configure("classpath:log4j.properties");

// 方式2:XML 文件
DOMConfigurator.configure("classpath:log4j.xml");

// 方式3:程序化配置(動態)
Logger root = Logger.getRootLogger();
root.addAppender(new ConsoleAppender(new PatternLayout("%d %p %c - %m%n")));

六、最佳實踐清單

  1. 級別分發:控制台 INFO+、文件 DEBUG+、錯誤文件 ERROR、郵件 FATAL。
  2. 異步寫入:Log4j 2.x + AsyncAppender / RandomAccessFileAppender。
  3. MDC 鏈路追蹤:MDC.put("traceId", UUID.randomUUID().toString()),Pattern 中 %X{traceId}。
  4. 滾動策略:按天 + 按大小雙觸發,保留 30 天 / 100 文件。
  5. 依賴排除:排除 log4j-over-slf4j 等舊橋接,統一門面 slf4j-api + 實現 log4j-slf4j-impl (Log4j 2.x)。

日誌不是「打印」,而是**可觀測性基礎設施**。配置得當,故障排查效率提升 10 倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
符號含義示例
%d時間%d{yyyy-MM-dd HH:mm:ss,SSS}
%p級別DEBUG/INFO/WARN/ERROR/FATAL
%cLogger 名稱%c{1} 只顯示簡短類名
%t線程名main, http-nio-8080-exec-1
%m日誌消息用戶登錄成功
%n換行符平台相關
%L行號性能較差,慎用
%F文件名UserService.java
%l位置信息UserService.login(UserService.java:42)
%r啟動毫秒數12345
%xNDC (嵌套診斷上下文)多線程區分
%X{key}MDC (映射診斷上下文)%X{traceId} 鏈路追蹤