出现log.info报红的解决方案

目录
  • 出现log.info报红
    • 1.装lombok插件
    • 2.导包
    • 3.配置log4j.properties
    • 4.报错的解决方案
  • 项目问题:log.info()导致CPU飙升
    • 首先使用top命令查看进程运行情况
    • 结论

出现log.info报红

1.装lombok插件

File——>Settings——>plugins——>search plugins   搜索lombok    安装,重启Intellij

如果您已经安装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:出现此错误请升级  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()把请求参数给打印了出来,方便看组装的参加,排查问题,参数中就包含我们的合同文件流,所以整个参数是一个大对象。在做压测的时候发现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这个进程有异常,在继续查看具体异常线程。

# 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);
        }
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解记录Java Log的几种方式

    在Java中记录日志的方式有如下几种: 一.System.out.println(最简单) 1.输出到控制台:System.out.println("XXX"); 2.输出到指定文件: import java.io.PrintStream; PrintStream ps = new PrintStream("D:\\test.txt"); System.setOut(ps); System.out.println("XXX"); 二.java.u

  • org.slf4j.Logger中info()方法的使用详解

    目录 org.slf4j.Logger中info()方法 如果info()方法参数为以下类型 使用范例1 使用范例2 如果info()方法参数如下 使用范例1 如果info()方法参数如下 使用范例1 log.info()传入多个参数的方法 org.slf4j.Logger中info()方法 如果info()方法参数为以下类型 public void info(String format, Object argArray[]) { if(logger.isInfoEnabled()) { For

  • 解决引用slf4j中Logger.info只打印出文字没有数据的问题

    目录 slf4j Logger.info只打印出文字没有数据 解决方案 启用设置org.slf4j.Logger打印并输出日志 pom.xml配置 logback.xml配置 程序调用 slf4j Logger.info只打印出文字没有数据 引的是 slf4j 包 import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static Logger logger = LoggerFactory.getLogger(TsfTe

  • 出现log.info报红的解决方案

    目录 出现log.info报红 1.装lombok插件 2.导包 3.配置log4j.properties 4.报错的解决方案 项目问题:log.info()导致CPU飙升 首先使用top命令查看进程运行情况 结论 出现log.info报红 1.装lombok插件 File——>Settings——>plugins——>search plugins   搜索lombok    安装,重启Intellij 如果您已经安装lombok插件,您也可选择重装lombok插件,但作者并不推荐,只作

  • 解决IDEA中Maven依赖包导入失败报红问题(总结最有效8种解决方案)

    问题描述: 真的,说来话长,这应该是我花最多时间去解决关于Maven依赖包导入的问题,以前粘贴复制导入,自动下载成功了, 这次怎么搞,怎么让他自动下载都还是红红的一片, 花了大半天,各种尝试,只为搏得问题解决!!! 真的看着都难受, 但是, 终于, 还是让我搞定了,这次让我汇总所有最有可能解决这依赖问题的方法,下次遇到这种问题, 真的要说再见了 , 话不多开,开货!!!方案1:(本人平时遇到这问题的常规操作) 当一开始遇到导入的依赖报红了,直接把那段刚导入的对应依赖删了,然后又重新导入,它自动会

  • spring-boot-maven-plugin报红解决方案(亲测有效)

    本文主要介绍了spring-boot-maven-plugin报红解决方案,亲测有效,具体如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoc

  • SpringBoot集成MybatisPlus报错的解决方案

    这篇文章主要介绍了SpringBoot集成MybatisPlus报错的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 启动的时候总是报如下错误: java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class 解决方案 需要一个mybatis-spring-boot-starter的包,在pom文件加上之后,完

  • pip已经安装好第三方库但pycharm中import时还是标红的解决方案

    已经pip安装好第三方库了,但是在pycharm中import还是标红,像下图: 我记得上次重装系统,出现这种情况的时候,我重启一下pycharm就行了(但是感觉pycharm一开一关很费时间) 还有一个解决办法: 点击File --> Settings --> Project --> Project interpreter--> 双击pip那一栏 在搜索框那一栏输入你导包标红的包 --> 再在左下角点击Install Package,直到出现Package '包名' ins

  • mybatis不加@Parm注解报错的解决方案

    我的idea版本2017.3.4,低版本貌似不会加上这个配置,idea高版本会 补充知识:Mybatis传多个参数的问题 及MyBatis报错 Parameter '0' not found. Available parameters are [arg1, arg0, param1 问题 对于使用Mybatis ,传多个参数,我们可以使用对象封装外,还可以直接传递参数 对象的封装,例如查询对象条件basequery对象 <select id="getProductByProductQuer

  • 解决goland 导入项目后import里的包报红问题

    解决办法: 1.Goland--->Preferences...--->Go--->GOPATH--->Project GOPATH下添加命令行go env下的GOPATH值,自行修改自己的Project GOPATH 2.正常情况下我们不需要自己去处理外部包的代理,但是也有可能就是你不经意之间做了修改,这边也是通过setting进行配置: 补充:GOLAND 导入项目后import里的包报红,以及$GOPATH/go.mod exists but should not 首先 im

  • 解决IDEA springboot"spring-boot-maven-plugin"报红问题

    使用环境 项目环境:Idea 2020.2.3. Maven 3.6.3 .springboot 2.1.4 本人在创建springboot项目时spring-boot-maven-plugin 及Idea右侧Plugins划红,导致项目启动打包有问题.虽然项目能跑,但是后续开发中可能会出现不可预知的问题.太碍眼决定把它解决掉. 可能原因: 1.maven没有刷新: 2.Maven插件下载速度太慢,从国外的中央仓库下载: 3.也有可能是本地springboot版本问题等.... 分析思路: 1.

  • Django migrate报错的解决方案

    前言 在讲解如何解决migrate报错原因前,我们先要了解migrate做了什么事情,migrate:将新生成的迁移脚本.映射到数据库中.创建新的表或者修改表的结构. 问题1:migrate怎么判断哪些迁移脚本需要执行? 它会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本. 问题2:migrate做了什么事情 将相关的迁移脚本翻译成SQL语句,在数据库中执行这个SQL语句. 如果这个SQL语句执行没

  • 解决 VSCode 编写 C++11 代码报红问题分析

    问题描述 今天在写 C++ 代码的时候用上 C++11 的特性,然后发现 VSCode 虽然可以编译通过,但是会在相应位置报红,如下图所示. 并且在编译的时候遇到如下警告: C1.cpp:62:14: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]         for (auto a : vec) 问题原因: VSCode 根据编译参数,无法检测 C++11 相关语法,因此出现报红和 warni

随机推荐