出現(xiàn)log.info報(bào)紅的解決方案
出現(xiàn)log.info報(bào)紅
1.裝lombok插件
File——>Settings——>plugins——>search plugins 搜索lombok 安裝,重啟Intellij
如果您已經(jīng)安裝lombok插件,您也可選擇重裝lombok插件,但作者并不推薦,只作為下策使用。
2.導(dǎo)包
無(wú)論使用Maven還是從本地導(dǎo)包,切記,要導(dǎo)入lombok與slf4j-log4j兩個(gè)包。前者依賴后者。
Maven導(dǎo)包如圖所示:
3.配置log4j.properties
本文意在說(shuō)明log.info報(bào)紅的原因,所以這里不做敘述,您可以另行查找。
4.報(bào)錯(cuò)的解決方案
- 程序包org.slf4j不存在:此錯(cuò)誤可能是未導(dǎo)入slf4j-log4j包導(dǎo)致。
- lombok.javac.apt.LombokProcessor could not be initialized:出現(xiàn)此錯(cuò)誤請(qǐng)升級(jí) lombok jar包版本
- 其他錯(cuò)誤:請(qǐng)到Setting——>Build、Execution、Deployment——>Compiler——>Annotation Processors勾選Enable annotation processing。
項(xiàng)目問(wèn)題:log.info()導(dǎo)致CPU飆升
項(xiàng)目問(wèn)題:log.info()導(dǎo)致CPU飆升
最近公司有個(gè)需求是對(duì)接E簽寶的,也就是CA認(rèn)證,大致的情況就是我們拿著文件去E簽寶做CA認(rèn)定,簡(jiǎn)單的理解就是拿著合同去E簽寶蓋章。
因?yàn)槭菍?duì)接三方的嗎,所以在調(diào)E簽寶服務(wù)的時(shí)候我就用log.info()把請(qǐng)求參數(shù)給打印了出來(lái),方便看組裝的參加,排查問(wèn)題,參數(shù)中就包含我們的合同文件流,所以整個(gè)參數(shù)是一個(gè)大對(duì)象。在做壓測(cè)的時(shí)候發(fā)現(xiàn)CPU很快就飆升到100%,并且耗時(shí)很久。但是我把打印日志的log.info()去掉之后,CPU和耗時(shí)馬上就降下來(lái)了。下面開(kāi)始排查這個(gè)問(wèn)題:
首先使用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這個(gè)進(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里查詢?cè)摼€程信息
# 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()這個(gè)方法,也就是這個(gè)地方導(dǎo)致壓測(cè)阻塞,響應(yīng)耗時(shí)比較久的問(wèn)題。
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); } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中字符串和byte數(shù)組之間的簡(jiǎn)單轉(zhuǎn)換方法
這篇文章主要給大家介紹了關(guān)于Java中字符串和byte數(shù)組之間的簡(jiǎn)單轉(zhuǎn)換方法,Java中將String類型轉(zhuǎn)換為byte[]類型,可以使用String的getBytes()方法,還有很多其他的辦法,需要的朋友可以參考下2023-08-08springboot 接口返回字符串帶引號(hào)的問(wèn)題解決
本文主要介紹了springboot 接口返回字符串帶引號(hào)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04java報(bào)錯(cuò)之springboot3+vue2項(xiàng)目web服務(wù)層報(bào)錯(cuò)總結(jié)
java入門學(xué)習(xí),隨手記錄一下開(kāi)發(fā)過(guò)程中產(chǎn)生的報(bào)錯(cuò),有些錯(cuò)誤是網(wǎng)上搜索再加上自己嘗試,隨手引用了一些其他人的記錄,也是留給自己看的,或是希望能對(duì)其他初學(xué)者有幫助2023-06-06基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例
這篇文章主要介紹了基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java中的JPA實(shí)體關(guān)系:JPA一對(duì)一,一對(duì)多(多對(duì)一),多對(duì)多
Java Persistence API(JPA)是Java平臺(tái)上的一個(gè)對(duì)象關(guān)系映射(ORM)規(guī)范,用于簡(jiǎn)化數(shù)據(jù)庫(kù)操作,其中實(shí)體關(guān)系的映射是核心內(nèi)容之一,本文將深入淺出地探討JPA中的三種基本實(shí)體關(guān)系類型:一對(duì)一、一對(duì)多、多對(duì)多,揭示常見(jiàn)問(wèn)題、易錯(cuò)點(diǎn)及其避免策略,希望能幫助大家2024-06-06