| 符號 | 含義 | 示例 |
| %d | 時間 | %d{yyyy-MM-dd HH:mm:ss,SSS} |
| %p | 級別 | DEBUG/INFO/WARN/ERROR/FATAL |
| %c | Logger 名稱 | %c{1} 只顯示簡短類名 |
| %t | 線程名 | main, http-nio-8080-exec-1 |
| %m | 日誌消息 | 用戶登錄成功 |
| %n | 換行符 | 平台相關 |
| %L | 行號 | 性能較差,慎用 |
| %F | 文件名 | UserService.java |
| %l | 位置信息 | UserService.login(UserService.java:42) |
| %r | 啟動毫秒數 | 12345 |
| %x | NDC (嵌套診斷上下文) | 多線程區分 |
| %X{key} | MDC (映射診斷上下文) | %X{traceId} 鏈路追蹤 |
四、高級場景實戰
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")));
六、最佳實踐清單
- 級別分發:控制台 INFO+、文件 DEBUG+、錯誤文件 ERROR、郵件 FATAL。
- 異步寫入:Log4j 2.x +
AsyncAppender / RandomAccessFileAppender。
- MDC 鏈路追蹤:
MDC.put("traceId", UUID.randomUUID().toString()),Pattern 中 %X{traceId}。
- 滾動策略:按天 + 按大小雙觸發,保留 30 天 / 100 文件。
- 依賴排除:排除
log4j-over-slf4j 等舊橋接,統一門面 slf4j-api + 實現 log4j-slf4j-impl (Log4j 2.x)。
日誌不是「打印」,而是**可觀測性基礎設施**。配置得當,故障排查效率提升 10 倍。
- 上一篇文章: JavaMail NoClassDefFoundError: LineInputStream 根因與一鍵修復
- 下一篇文章: jQuery AJAX 三大核心方法實戰:load / $.post / $.ajax 與 Struts2 整合
Copyright ©
程式碼之家 All Rights Reserved