socket
进行连接,但是没有设置超时时间,当日志中有多个${导致循环调用多次 。所以上面日志打印会重复2次 jndi
的操作,又因为我们日志打印配置了console
和 rollingFile
。所以会打印四次日志 。
gateway
采用 Netty
作为底层容器,采用了Reactor
模式,有一个事件循环组负责监听事件,事件到达后会丢给另一个事件循环组去处理读写,事件循环组内有多个事件循环器,每个事件循环器由一个线程去处理业务读写,因此打印上面日志会阻塞住其中一个处理线程 。从dump
出来的单个文件看是只有一个处理线程被阻塞了 。而当进行心跳健康判断的时候,有一定几率会被分配给阻塞的线程,因此会放到队列中一直等待线程处理,进而超时了 把 gateway
网关重启了;
四、问题解决办法
参考文档: https://logging.apache.org/log4j/2.x/security.html建议解决办法
- 升级版本 。
Apache Log4j 2.x >= 2.3.2 (Java 6)Apache Log4j 2.x >= 2.12.4 (Java 7)Apache Log4j 2.x >= 2.17.1 (Java 8 及更新版)
- 删除
JndiLookup.class
类
在 2.16.0 以外的任何版本中,您可以JndiLookup
从类路径中删除该类:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
。
- 配置环境变量
LOG4J_FORMAT_MSG_NO_LOOKUPS
为true
(处理场景有限)
java
opts
配置为-Dlog4j2.formatMsgNoLookups=true
(处理场景有限)

文章插图
配置完成之后

文章插图
前者处理为56秒,后者需要的时间为
354ms
. 是正常的响应时间 。经验总结扩展阅读
- 奥运会一般多久
- day05-JavaScript02
- 新菜板第一次使用前怎样处理好
- 不粘锅新锅第一次用怎么处理
- Java获取/resources目录下的资源文件方法
- Java:既然有了synchronized,为什么还要提供Lock?
- 附:2种实现方式详细对比 Java 动态代理原理图解
- 深度剖析Java的volatile实现原理,再也不怕面试官问了
- 保险赔完了是不是就给车主没关系了 保险理赔一次后还有效吗
- 6 Java多线程:锁与AQS(下)