出現(xiàn)log.info報紅的解決方案
出現(xiàn)log.info報紅
1.裝lombok插件
File——>Settings——>plugins——>search plugins 搜索lombok 安裝,重啟Intellij
如果您已經(jīng)安裝lombok插件,您也可選擇重裝lombok插件,但作者并不推薦,只作為下策使用。
2.導包
無論使用Maven還是從本地導包,切記,要導入lombok與slf4j-log4j兩個包。前者依賴后者。
Maven導包如圖所示:

3.配置log4j.properties
本文意在說明log.info報紅的原因,所以這里不做敘述,您可以另行查找。
4.報錯的解決方案
- 程序包org.slf4j不存在:此錯誤可能是未導入slf4j-log4j包導致。
- lombok.javac.apt.LombokProcessor could not be initialized:出現(xiàn)此錯誤請升級 lombok jar包版本
- 其他錯誤:請到Setting——>Build、Execution、Deployment——>Compiler——>Annotation Processors勾選Enable annotation processing。
項目問題:log.info()導致CPU飆升
項目問題:log.info()導致CPU飆升
最近公司有個需求是對接E簽寶的,也就是CA認證,大致的情況就是我們拿著文件去E簽寶做CA認定,簡單的理解就是拿著合同去E簽寶蓋章。
因為是對接三方的嗎,所以在調E簽寶服務的時候我就用log.info()把請求參數(shù)給打印了出來,方便看組裝的參加,排查問題,參數(shù)中就包含我們的合同文件流,所以整個參數(shù)是一個大對象。在做壓測的時候發(fā)現(xiàn)CPU很快就飆升到100%,并且耗時很久。但是我把打印日志的log.info()去掉之后,CPU和耗時馬上就降下來了。下面開始排查這個問題:
首先使用top命令查看進程運行情況
# 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這個進程有異常,在繼續(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
找到了當前異常進程下的異常線程后使用jstack查看詳細情況
# jstack -l 6377 > error.log 將線程ID打印成16進制形式 # 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)
結論
在log4j 中,logger.info等日志記錄方法是同步的(使用了synchronized),大量的日志導致線程阻塞在callAppenders()這個方法,也就是這個地方導致壓測阻塞,響應耗時比較久的問題。
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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java報錯之springboot3+vue2項目web服務層報錯總結
java入門學習,隨手記錄一下開發(fā)過程中產生的報錯,有些錯誤是網(wǎng)上搜索再加上自己嘗試,隨手引用了一些其他人的記錄,也是留給自己看的,或是希望能對其他初學者有幫助2023-06-06
Java中的JPA實體關系:JPA一對一,一對多(多對一),多對多
Java Persistence API(JPA)是Java平臺上的一個對象關系映射(ORM)規(guī)范,用于簡化數(shù)據(jù)庫操作,其中實體關系的映射是核心內容之一,本文將深入淺出地探討JPA中的三種基本實體關系類型:一對一、一對多、多對多,揭示常見問題、易錯點及其避免策略,希望能幫助大家2024-06-06

