Log4j 2 是 Java 生態新一代日誌框架,基於 LMAX Disruptor 非同步架構,效能較 Log4j 1.x 提升 10 倍以上。本文提供生產級配置模板,涵蓋非同步日誌、滾動文件、多環境隔離、參數化日誌、效能調優全方位實戰。
org.apache.logging.log4j
log4j-api
2.23.1
org.apache.logging.log4j
log4j-core
2.23.1
com.lmax
disruptor
3.4.4
org.apache.logging.log4j
log4j-slf4j2-impl
2.23.1
%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
logs
myapp
| 配置項 | 作用 | 推薦值 |
|---|---|---|
monitorInterval | 熱加載間隔(秒) | 30 (生產) / 5 (開發) |
Async bufferSize |
環形緩衝區大小 (2 的冪) | 8192 (高併發) / 1024 (低併發) |
includeLocation |
是否記錄行號/類名 (極耗效能) | false (生產必關) |
additivity |
是否向父 Logger 傳遞 | false (避免重複輸出) |
ThresholdFilter |
按級別過濾 | 錯誤日誌單獨文件 |
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OrderService {
// 靜態最終,類加載時初始化,避免重複創建
private static final Logger log = LoggerFactory.getLogger(OrderService.class);
public void createOrder(OrderDTO dto) {
// 參數化日誌:滿足級別才構建字符串,避免無效字符串拼接
log.info("創建訂單: userId={}, amount={}, items={}",
dto.getUserId(), dto.getAmount(), dto.getItems());
try {
// 業務邏輯
} catch (Exception e) {
// 異常必帶參數上下文,堆棧信息自動記錄
log.error("訂單創建失敗: orderNo={}, userId={}",
dto.getOrderNo(), dto.getUserId(), e);
throw new BusinessException("創建失敗", e);
}
}
}
或用系統屬性切換:-Dlog4j2.configurationFile=log4j2-prod.xml
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 或配置 <Async>includeLocation="false",避免 StackWalker 開銷log.info("msg {} {}", a, b) 而非 log.info("msg " + a + " " + b)bufferSize (8192/16384),監控 AsyncQueueFull 丟棄事件LogManager.shutdown() 刷新緩衝區