log4j2 日志引起的系統(tǒng)崩潰

問題:每日0點(diǎn)系統(tǒng)內(nèi)存占用飆升,大量掛起線程漏健,系統(tǒng)停頓, log4j2版本:2.7
Thread Stack:

AsyncAppender-async
  at sun.misc.Unsafe.park(ZJ)V (Native Method)
  at java.util.concurrent.locks.LockSupport.park(Ljava/lang/Object;)V (LockSupport.java:175)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt()Z (AbstractQueuedSynchronizer.java:836)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(I)V (AbstractQueuedSynchronizer.java:997)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(I)V (AbstractQueuedSynchronizer.java:1304)
  at java.util.concurrent.Semaphore.acquire()V (Semaphore.java:312)
  at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.rollover(Lorg/apache/logging/log4j/core/appender/rolling/RolloverStrategy;)Z (RollingFileManager.java:247)
  at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.rollover()V (RollingFileManager.java:192)
  at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover(Lorg/apache/logging/log4j/core/LogEvent;)V (RollingFileManager.java:175)
  at org.apache.logging.log4j.core.appender.RollingFileAppender.append(Lorg/apache/logging/log4j/core/LogEvent;)V (RollingFileAppender.java:280)
  at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(Lorg/apache/logging/log4j/core/LogEvent;)V (AppenderControl.java:156)
  at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(Lorg/apache/logging/log4j/core/LogEvent;)V (AppenderControl.java:129)
  at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(Lorg/apache/logging/log4j/core/LogEvent;)V (AppenderControl.java:120)
  at org.apache.logging.log4j.core.config.AppenderControl.callAppender(Lorg/apache/logging/log4j/core/LogEvent;)V (AppenderControl.java:84)
  at org.apache.logging.log4j.core.appender.AsyncAppender$AsyncThread.callAppenders(Lorg/apache/logging/log4j/core/LogEvent;)Z (AsyncAppender.java:451)
  at org.apache.logging.log4j.core.appender.AsyncAppender$AsyncThread.run()V (AsyncAppender.java:404)

Leak Report:

One instance of **"java.util.concurrent.ArrayBlockingQueue"** loaded by **"<system class loader>"** occupies **897,341,688 (95.23%)** bytes. The instance is referenced by **org.apache.logging.log4j.core.appender.AsyncAppender$AsyncThread @ 0xc0700150 AsyncAppender-async** , loaded by **"org.springframework.boot.loader.LaunchedURLClassLoader @ 0xc0400000"**. The memory is accumulated in one instance of **"java.lang.Object[]"** loaded by **"<system class loader>"**.

The stacktrace of this Thread is available. [See stacktrace](../pages/24.html).

**Keywords**
java.util.concurrent.ArrayBlockingQueue
java.lang.Object[]
org.springframework.boot.loader.LaunchedURLClassLoader @ 0xc0400000

原因:每日0點(diǎn)觸發(fā)log4j的rollover策略,semaphore設(shè)置的1個橘霎,所有的log輸出都會在未完成切割任務(wù)時掛起等待切割完成蔫浆。程序中多線程任務(wù)很多且打印日志的地方也很多,就早成瞬間積壓超過了承受能力姐叁。

        try {
            // Block until the asynchronous operation is completed.
            semaphore.acquire();
        } catch (final InterruptedException e) {
            logError("Thread interrupted while attempting to check rollover", e);
            return false;
        }

解決:
升級log4j2到2.14版本并且啟用Disruptor異步處理瓦盛,這是一種無鎖的線程間通信庫

  1. 啟用的方式有兩種,一種是在vm參數(shù)中加入
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

一種是在xml文件中不再使用Root標(biāo)簽外潜,而改用:

<AsyncRoot level="info" includeLocation="true">
    <appender-ref ref="Console"/>
    <appender-ref ref="RollingFileInfo"/>
    <appender-ref ref="RollingFileError"/>
</AsyncRoot>

兩種方式以第一種性能更佳原环,差別不大

  1. 在classpath下新建文件:log4j2.component.properties
    增加配置:
log4j2.AsyncQueueFullPolicy=Discard #隊列滿時放棄日志操作
AsyncLoggerConfig.SynchronizeEnqueueWhenQueueFull=true #當(dāng)隊列滿時同步入列,這是默認(rèn)值处窥,實際還是走AsyncQueueFullPolicy策略
AsyncLoggerConfig.RingBufferSize=131072 #隊列長度嘱吗,Disruptor使用的不是真正意義上的隊列,而是類似于計數(shù)器+事件的方式滔驾。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谒麦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嵌灰,更是在濱河造成了極大的恐慌弄匕,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沽瞭,死亡現(xiàn)場離奇詭異迁匠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)驹溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門城丧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豌鹤,你說我怎么就攤上這事亡哄。” “怎么了布疙?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵蚊惯,是天一觀的道長愿卸。 經(jīng)常有香客問我,道長截型,這世上最難降的妖魔是什么趴荸? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮宦焦,結(jié)果婚禮上发钝,老公的妹妹穿的比我還像新娘。我一直安慰自己波闹,他們只是感情好酝豪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著精堕,像睡著了一般孵淘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锄码,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天夺英,我揣著相機(jī)與錄音晌涕,去河邊找鬼滋捶。 笑死,一個胖子當(dāng)著我的面吹牛余黎,可吹牛的內(nèi)容都是我干的重窟。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼惧财,長吁一口氣:“原來是場噩夢啊……” “哼巡扇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起垮衷,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤厅翔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搀突,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刀闷,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年仰迁,在試婚紗的時候發(fā)現(xiàn)自己被綠了甸昏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡徐许,死狀恐怖施蜜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雌隅,我是刑警寧澤翻默,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布缸沃,位于F島的核電站,受9級特大地震影響修械,放射性物質(zhì)發(fā)生泄漏和泌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一祠肥、第九天 我趴在偏房一處隱蔽的房頂上張望武氓。 院中可真熱鬧,春花似錦仇箱、人聲如沸县恕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忠烛。三九已至,卻和暖如春权逗,著一層夾襖步出監(jiān)牢的瞬間美尸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工斟薇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留师坎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓堪滨,卻偏偏與公主長得像胯陋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袱箱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容