用了这么久的Log4j这次倒下了,而且官方也还没有给出解决方案。

描述:tomcat 经过一天多时间的访问,出现了hang ,使用 Jstack 查看堆栈后,发现现成 blocked ,主要是 Log4j 的ROOTlock了。

"http-nio-2180-exec-9" #35 daemon prio=5 os_prio=0 tid=0x0000000021a8b000 nid=0x12a8 runnable [0x000000002e5ee000]java.lang.Thread.State: RUNNABLEat java.io.FileOutputStream.writeBytes(Native Method)at java.io.FileOutputStream.write(Unknown Source)at java.io.BufferedOutputStream.write(Unknown Source)- locked <0x00000006c0cf7380> (a java.io.BufferedOutputStream)at java.io.PrintStream.write(Unknown Source)- locked <0x00000006c0cf7360> (a java.io.PrintStream)at org.apache.tomcat.util.log.SystemLogHandler.write(SystemLogHandler.java:172)at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)at sun.nio.cs.StreamEncoder.implFlush(Unknown Source)at sun.nio.cs.StreamEncoder.flush(Unknown Source)- locked <0x00000006c0eb2428> (a java.io.OutputStreamWriter)at java.io.OutputStreamWriter.flush(Unknown Source)at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:59)at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:324)at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)- locked <0x00000006c0eaf3b8> (a org.apache.log4j.ConsoleAppender)at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)at org.apache.log4j.Category.callAppenders(Category.java:206)- locked <0x00000006c0ea85c8> (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.apache.commons.logging.impl.Log4JLogger.debug(Log4JLogger.java:155)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:861)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)- locked <0x00000006c27752a8> (a org.apache.tomcat.util.net.NioChannel)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Unknown Source)

被锁住的线程堆栈:

"http-nio-2180-exec-10" #36 daemon prio=5 os_prio=0 tid=0x0000000021a8c000 nid=0xcfc waiting for monitor entry [0x000000002e49e000]java.lang.Thread.State: BLOCKED (on object monitor)at org.apache.log4j.Category.callAppenders(Category.java:204)- waiting to lock <0x00000006c0ea85c8> (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.apache.commons.logging.impl.Log4JLogger.debug(Log4JLogger.java:155)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:861)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)- locked <0x00000006c2723a10> (a org.apache.tomcat.util.net.NioChannel)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Unknown Source)

查了很多资料,比较全的是这个老兄回答的:

http://stackoverflow.com/questions/3537870/production-settings-file-for-log4j/

第一个回答的截取在这里,备份下,解决方案他也提到了,不过只是减缓,没有完全解决。

Log4j 1.2 is vulnerable to deadlocks when toString() produces nested logging.

See old aged still unresolved issues like Log4J can create deadlock conditions (concurrent package donation) and Deadlock with RollingFileAppender.

It also has performance-killing lock synchronization issues under heavy concurrent load. LikeCategory callAppenders synchronization causes java.lang.Thread.State: BLOCKED and Move org.apache.log4j.Category to reentrant read/write locks.

Even AsyncAppender is not free of excessive locks: AsyncAppender.doAppend() does not need to be synchronized and Deadlock in 1.2.15 caused by AsyncAppender and ThrowableInformation classes. Also beware of AsyncAppender overflow.

One caveat is to always constrain root category level to at least INFO or higher. This would prevent logging calls from acquiring unnecessary locks mentioned in the above issues. Just limiting appender threshold is not sufficient as it is taken into account later. See explanation with publish/subscribe analogy. Nested categories of interest can be individually given lower priorities if needed.

转载于:https://www.cnblogs.com/AloneSword/p/4894055.html

log4j deadlock相关推荐

  1. java log4j和logback,跨过slf4j和logback,直接晋级log4j 2

    今年一直关注log4j 2,但至今还没有出正式版.等不及了,今天正式向大家介绍一下log4j的升级框架,log4j 2. log4j,相信大家都熟悉,至今对java影响最大的logging系统,至今仍 ...

  2. Apache Log4j 2.0-rc1 发布

    Apache Log4j 2.0-rc1 发布,这是第十二个发布版本,而且是 Log4j 2 的第一个 RC 版本.此版本主要是 bug 修复和功能增强.此版本向后兼容之前的版本.主要更新内容如下: ...

  3. APPARENT DEADLOCK Creating emergency threads for unassigned pending tasks

    项目场景: 在迁移CDH集群的元数据库后,重新启动集群,发现启动失败. APPARENT DEADLOCK!!! Creating emergency threads for unassigned p ...

  4. Go 知识点(02)— channel 使用不当导致的 deadlock

    运行下面这段代码输出的结果是什么? package mainimport ("fmt" )func main() {c := make(chan string) // 创建一个无缓 ...

  5. fatal error all goroutines are asleep - deadlock!

    先看下面代码 package mainimport ("fmt""time" )func main() {ch1 := make(chan int)go fun ...

  6. log4j屏蔽掉某个包下的log日志打印

    在log4j的配置文件下配置 ## Disable other log log4j.logger.com.summaryday.framework.db=OFF log4j定义了8个级别的log(除去 ...

  7. [转]slf4j + log4j原理实现及源码分析

    slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html

  8. log4j 压缩日志_Spring Boot 日志各种使用姿势,是时候捋清楚了!

    来自公众号:江南一点雨 1. Java 日志概览 1.1 总体概览 1.2 日志级别 1.3 综合对比 1.4 最佳实践 2. Spring Boot 日志实现 2.1 Spring Boot 日志配 ...

  9. 开发log4j配置_Spring 使用 Log4J 记录日志

    在 Spring 应用程序中使用 Log4J 的功能是非常容易的.下面的例子将带你通过简单的步骤解释 Log4J 和 Spring 之间的简单集成. 假设你已经在你的机器上安装了 Log4J,如果你还 ...

  10. mongodb java 日志分析_记一次log4j与mongodb集成引发的问题分析

    问题背景 对项目中的关键应用调用链日志需要结构化得统一吐出到mongodb中,同时项目中日志输出使用log4j,故准备使用log4j的Appender直接集成mongodb的输出,同时mongodb采 ...

最新文章

  1. CVPR2020论文解读:3D Object Detection三维目标检测
  2. SpringMVC处理模型数据
  3. Mysql InnoDB 数据更新/删除导致锁表
  4. 如何在GraphPad Prism 9图表上添加图片或其他对象
  5. Win7系统电脑修改不了文件属性怎么办
  6. 【README】回溯算法基本框架
  7. 修改jar 注入_Apache Tika命令注入漏洞挖掘
  8. html取json列表长度,js获取json元素数量的方法
  9. 移动通信原理B-------课后作业1
  10. Linux查询本机的内网IP和外网IP
  11. Unity2D 简易2D地图 —— 地图的显示
  12. CCU ETL脚本列表
  13. Window7和Ubuntu双系统 删除Ubuntu
  14. Maven 报错:Cannot resolve plugin org.apache.maven.plugins:maven-resources-plugin:2.6
  15. matlab拉普拉斯锐化程序,laplace(拉普拉斯)锐化matlab程序
  16. 斐波那契回调线怎么画_斐波那契回调线的用法
  17. H5播放webrtc视频
  18. 上天了,但也炸了:马斯克的「星舰」离火星又近了一步
  19. 可以使用中文作为变量名_UG NX软件在使用中文名称的系统用户名解决方案(UGII_TMP_DIR)
  20. Redis——Redis主从复制(工作流程详解)

热门文章

  1. linux设备驱动程序注册过程详解
  2. python程序停止运行、重新开始_求教,程序执行到末尾如何重新开始的问题。
  3. Jenkins系列三通过脚本方式部署maven项目,maven聚合项目到Tomcat
  4. 【渝粤教育】国家开放大学2018年秋季 1018t国际公法 参考试题
  5. 【渝粤教育】国家开放大学2018年秋季 1301T病理生理学 参考试题
  6. 【渝粤教育】国家开放大学2018年春季 0275-21T内科护理学 参考试题
  7. 【渝粤教育】国家开放大学2018年春季 8668-21T汽车涂装技术(A) 参考试题
  8. 电影票房预测问题:如何使用Python生成词云
  9. centos 7 x86_64上安装staruml2.8.0
  10. 详解Angular开发中的登陆与身份验证