出現(xiàn)log.info報紅的解決方案
出現(xiàn)log.info報紅
1.裝lombok插件
File——>Settings——>plugins——>search plugins 搜索lombok 安裝,重啟Intellij
如果您已經(jīng)安裝lombok插件,您也可選擇重裝lombok插件,但作者并不推薦,只作為下策使用。
2.導(dǎo)包
無論使用Maven還是從本地導(dǎo)包,切記,要導(dǎo)入lombok與slf4j-log4j兩個包。前者依賴后者。
Maven導(dǎo)包如圖所示:
3.配置log4j.properties
本文意在說明log.info報紅的原因,所以這里不做敘述,您可以另行查找。
4.報錯的解決方案
- 程序包org.slf4j不存在:此錯誤可能是未導(dǎo)入slf4j-log4j包導(dǎo)致。
- lombok.javac.apt.LombokProcessor could not be initialized:出現(xiàn)此錯誤請升級 lombok jar包版本
- 其他錯誤:請到Setting——>Build、Execution、Deployment——>Compiler——>Annotation Processors勾選Enable annotation processing。
項目問題:log.info()導(dǎo)致CPU飆升
項目問題:log.info()導(dǎo)致CPU飆升
最近公司有個需求是對接E簽寶的,也就是CA認(rèn)證,大致的情況就是我們拿著文件去E簽寶做CA認(rèn)定,簡單的理解就是拿著合同去E簽寶蓋章。
因為是對接三方的嗎,所以在調(diào)E簽寶服務(wù)的時候我就用log.info()把請求參數(shù)給打印了出來,方便看組裝的參加,排查問題,參數(shù)中就包含我們的合同文件流,所以整個參數(shù)是一個大對象。在做壓測的時候發(fā)現(xiàn)CPU很快就飆升到100%,并且耗時很久。但是我把打印日志的log.info()去掉之后,CPU和耗時馬上就降下來了。下面開始排查這個問題:
首先使用top命令查看進(jìn)程運(yùn)行情況
# top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7020 root 20 0 2538892 164144 11856 S 90.3 8.7 61:23.54 java 11022 root 20 0 2560528 241340 11920 S 0.3 12.8 311:23.23 java 26805 root 20 0 32612 4036 2472 S 0.3 0.2 24:50.95 AliYunDunUpdate 26838 root 10 -10 134120 14524 5924 S 0.3 0.8 343:05.22 AliYunDun 1 root 20 0 43280 3300 2108 S 0.0 0.2 2:16.82 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:01.78 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 1:30.68 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 65:15.85 rcu_sched 10 root rt 0 0 0 0 S 0.0 0.0 2:14.65 watchdog/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
查詢到7020這個進(jìn)程有異常,在繼續(xù)查看具體異常線程。
# top -Hp 7020 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 23328 root 20 0 2538892 164144 11856 S 90.0 8.7 0:00.00 java
找到了當(dāng)前異常進(jìn)程下的異常線程后使用jstack查看詳細(xì)情況
# jstack -l 6377 > error.log 將線程ID打印成16進(jìn)制形式 # printf "%x\n" 23328 5b20
然后從jstack里查詢該線程信息
# grep '18e9' error.log --color "http-bio-6379-exec-200" #8869954 daemon prio=5 os_prio=0 tid=0x00007f74a81f6800 nid=0x5b20 waiting for monitor entry [0x00007f742457f000]
最后從jstack文件定位到堆棧信息
"http-bio-7020-exec-200" #8869954 daemon prio=5 os_prio=0 tid=0x00007f74a81f6800 nid=0x5b20 waiting for monitor entry [0x00007f742457f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:204)
- waiting to lock <0x00000000800371d0> (a org.apache.log4j.spi.RootLogger)
at org.apache.log4j.Category.forcedLog(Category.java:391)
at org.apache.log4j.Category.log(Category.java:856)
at org.slf4j.impl.Log4jLoggerAdapter.info(Log4jLoggerAdapter.java:368)
結(jié)論
在log4j 中,logger.info等日志記錄方法是同步的(使用了synchronized),大量的日志導(dǎo)致線程阻塞在callAppenders()這個方法,也就是這個地方導(dǎo)致壓測阻塞,響應(yīng)耗時比較久的問題。
public void callAppenders(LoggingEvent event) { int writes = 0; for(Category c = this; c != null; c = c.parent) { synchronized(c) { if (c.aai != null) { writes += c.aai.appendLoopOnAppenders(event); } if (!c.additive) { break; } } } if (writes == 0) { this.repository.emitNoAppenderWarning(this); } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中字符串和byte數(shù)組之間的簡單轉(zhuǎn)換方法
這篇文章主要給大家介紹了關(guān)于Java中字符串和byte數(shù)組之間的簡單轉(zhuǎn)換方法,Java中將String類型轉(zhuǎn)換為byte[]類型,可以使用String的getBytes()方法,還有很多其他的辦法,需要的朋友可以參考下2023-08-08java報錯之springboot3+vue2項目web服務(wù)層報錯總結(jié)
java入門學(xué)習(xí),隨手記錄一下開發(fā)過程中產(chǎn)生的報錯,有些錯誤是網(wǎng)上搜索再加上自己嘗試,隨手引用了一些其他人的記錄,也是留給自己看的,或是希望能對其他初學(xué)者有幫助2023-06-06基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例
這篇文章主要介紹了基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java中的JPA實體關(guān)系:JPA一對一,一對多(多對一),多對多
Java Persistence API(JPA)是Java平臺上的一個對象關(guān)系映射(ORM)規(guī)范,用于簡化數(shù)據(jù)庫操作,其中實體關(guān)系的映射是核心內(nèi)容之一,本文將深入淺出地探討JPA中的三種基本實體關(guān)系類型:一對一、一對多、多對多,揭示常見問題、易錯點及其避免策略,希望能幫助大家2024-06-06