log4j2最佳實踐 侵刪

2021-09-29 22:03:07 字數 3101 閱讀 1776

pom配置

org.slf4j

slf4j-api

1.7.24

org.apache.logging.log4j

log4j-1.2-api

2.11.0

org.apache.logging.log4j

log4j-core

2.11.0

org.apache.logging.log4j

log4j-api

2.11.0

org.apache.logging.log4j

log4j-slf4j-impl

2.11.0

注意,不可同時使用log4j-slf4j-impl和log4j-to-slf4j,否則會引發迴圈依賴。詳情見log4j官方文件。

如果使用了upcommonlog,橋接也要替換為2.x版本

com.unionpay.common.upcommon-log

uplog-bridge-log4j2.x

1.2.1

如果使用非同步日誌,需要加入disruptor依賴

com.lmax

disruptor

3.4.2

為了防止干擾,可以將其他元件引入的log4j 1的依賴exclude掉

示例配置1——最簡配置

說明:在這種配置下,應用日誌全部列印在同乙個日誌檔案中,應用中使用的公共元件日誌因為沒有配置logger所以不會列印(會列印在root logger配置的console中)。建議應用根據該檔案作適當修改,以適配具體的應用日誌需求

配置檔案如下

<?xml version="1.0" encoding="utf-8"?>

logs

%d [%level] %c - %msg%n

$

示例配置2——日誌分類

配置檔案如下

<?xml version="1.0" encoding="utf-8"?>

logs

%d [%level] %c - %msg%n

$filepattern="$/server.log.%d.%i.gz">$

全域性非同步:配置按照同步方式配,通過新增jvm啟動引數即可開啟全域性非同步,無需修改配置和應用

混合非同步:使用非同步logger和同步logger的混合配置,且不開啟全域性非同步,即logger配置中部分asynclogger,部分logger

日誌模式使用注意事項

log4j2提供了基於檔案大小的滾動策略和基於時間的滾動策略,也可以二者並用,這裡給出基於大小的滾動策略配置和基於大小/時間雙滾動策略配置。

基於大小的滾動策略

此種策略的空間占用計算公式為(這裡計算的是最大空間需求)

日誌空間需求=日誌滾動閾值(例如500m)+日誌留存個數*日誌滾動閾值*1/壓縮比(對於gz壓縮比一般會是幾十,具體根據應用日誌壓縮後計算)
例如假設壓縮比為50,則500m的檔案壓縮後只有10m,那麼上述配置總空間大小是

日誌空間需求=500m+20*500*1/50=700m
基於大小/時間雙滾動滾動策略

此種策略的空間占用計算公式為(這裡計算的是最大空間需求)

日誌留存個數=保留時間*單位時間內最大日誌個數

日誌空間需求=日誌滾動閾值(例如500m)+日誌留存個數*日誌滾動閾值*1/壓縮比(對於gz壓縮比一般會是幾十,具體根據應用日誌壓縮後計算)

例如假設壓縮比為50,則500m的檔案壓縮後只有10m,那麼上述配置總空間大小是

日誌留存個數=3*24*20=1440

日誌空間需求=500m+1440*500*1/50=15g

注意,控制總的日誌留存時間的機制,需要log4j-2.5及以上的版本支援,建議使用2.11版本

log4j2的日誌使用了disruptor,其內部使用了基於ringbuffer的環形佇列,並且也有生產者消費者的概念。在消費者等待訊息事件(也就是日誌訊息)時,其內部有一處等待策略的配置,配置項可以是block/timeout/sleep/yield,預設timeout,不同策略的含義如下

log4j2預設策略是timeout,在實際測試中,我們嘗試測試出不同策略下的cpu占用和延遲時間情況,但測試結果並沒有明顯的資料對比,因此這裡僅供參考,應用如果修改,需要結合場景做全面的測試。例如如果發現cpu占用較高,可以嘗試修改為block或者其他策略並測試觀察。

修改disruptor wait策略的方法為(以修改為block為例)

-dlog4j2.asyncloggerwaitstrategy=block
此處針對的是使用了slf4j的**,不適用於其它情況

我們知道,slf4j列印日誌可以使用佔位符的方式,例如一般列印日誌的**:

logger.debug("this is log4j2, current time:" + system.currenttimemillis());
在使用了slf4j的情況下,該句的功能等價於

logger.debug("this is log4j2, current time:{}", system.currenttimemillis());
如果這種情況非常多,那麼直接拼接字串的方式對於記憶體的浪費就非常明顯了,這時候使用佔位符的方式,可以明顯的改善字串的生成數量。當然也不是說任何地方都要使用佔位符,因為佔位符拼接成字串,也是有開銷的,起碼要遍歷佔位符後面的引數。因此一般建議:

log4j2 使用詳解

1.log4j2的匯入 2.測試用例 log4j 2.0的使用非常簡單,只要用logmanager的getlogger函式獲取乙個logger,就可以使用logger記錄日誌,如下 import org.apache.logging.log4j.logmanager import org.apach...

Log4j2使用案例

全乾貨記錄 link org.apache.logging.log4jgroupid log4j apiartifactid 2.13.3version dependency org.apache.logging.log4jgroupid log4j coreartifactid 2.13.3ver...

log4j2效能優化

背景 最近在做log4j公升級到log4j2的專案,在測試公升級之後的效能時,被驚了一下,效能沒有提公升,反而下降了,趕緊研究了一下log4j2的相關配置,以下是研究結果。1.2.不要使用location相關屬性,例如 c or class,f or file,l or location,l or ...