`

log4j Category.callAppenders Block

    博客分类:
  • JAVA
 
阅读更多

经常在高并发下就遇到log4j用错引起的线程block住的问题,看经常遇到问题的代码段如下:

 

public  void callAppenders(LoggingEvent event) {
    int writes = 0;

    for(Category c = this; c != null; c=c.parent) {
      // Protected against simultaneous call to addAppender, removeAppender,...
      synchronized(c) {
	if(c.aai != null) {
	  writes += c.aai.appendLoopOnAppenders(event);
	}
	if(!c.additive) {
	  break;
	}
      }
    }

    if(writes == 0) {
      repository.emitNoAppenderWarning(this);
    }
  }

 在内部会有个同步块,伴随着这个同步块可能会引起一个锁竞争导致cpu感觉像是hang住一样。

 针对这个问题已经有了bug,见  https://issues.apache.org/bugzilla/show_bug.cgi?id=41214

 同时针对这个bug也提出了新的解决方案,使用rw lock。

 

不过如果不升级log4j,在误用的情况下还是会出现这个问题。针对这个说下正确的使用方法,同事给出来最佳使用方法可以避免这个问题,很简单log对象每次使用时都需要是static的,说明白点就是

 

private static final Log log = LogFactory.getLog("xxx");

 

顺便刚好有一篇和log4J 死锁相关的文章

 

Log4j Thread Deadlock - A Case Study

http://java.dzone.com/articles/log4j-thread-deadlock-case

分享到:
评论
1 楼 无心流泪wan 2018-06-26  
private static final Log log = LogFactory.getLog("xxx"); 
如果采用的log仍然是log4j,仍旧不能解决锁竞争的问题吧?

另外我认为IO瓶颈是线程block的主要原因,并不是因为sychronized的大锁问题

相关推荐

    log4j2.component.properties

    log4j2.component.properties

    Log4j2学习log4j2.xml配置模板

    Log4j2学习笔记,引入log4j2的依赖-log4j2.xml配置模板-application.properties文件配置-使用

    log4j2.xml文件

    log4j2.xml文件

    log4j2.xml

    使用log4j2.xml实现对日志的精准控制,对整个开发过程百利有之!但是也要也要注意使用的误区,具体可才看本博客下的Java异常和日志管理!

    log4j日志驱动包

    Log4j比较全面的配置 log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true # 应用于控制台 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j....

    Log4j日志包

    #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n ################### # 单个日子记录 ################### log4j...

    log4j2-所需jar包+配置详解(详细)

    关于配置文件的名称以及在项目中的存放位置  log4j 2.x版本不再支持像1.x中的....如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。

    log4j2.properties

    log4j2.properties,采用properties的方式配置log4j2。

    log4j.jar各个版本

    apache-log4j-1.2.15.jar, apache-log4j-extras-1.0.jar, apache-log4j-extras-1.1.jar, apache-log4j.jar, log4j-1.2-api-2.0.2-javadoc.jar, log4j-1.2-api-2.0.2-sources.jar, log4j-1.2-api-2.0.2.jar, log4j-...

    log4j.jar包,和log4j.properties配置文件下载

    Log4j.jar包,和log4j.properties属性文件打包下载.

    log4j.properties(完整版) log4j.properties(精简版)

    java 日志出入log4j配置文件(完整版和精简版) log4j.properties(完整版) log4j.properties(精简版)

    log4j.properties

    log4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j....

    log4j2.xml记录日志到到数据库

    演示了java记录通过log4j2记录日志到mysql数据库中

    Log4j1.2.chm

    Log4j1.2.chm

    log4j详解.txt

    log4j详解.txtlog4j详解.txt

    log4j2配置文件log4j2.xml

    log4j2.xml 应用级的配置文件 支持窗体输出、error、info、trace error和trace按照日生成和清理文件 info按照小时生成和清理文件

    Log4J文档.doc

    Log4J文档.doc Log4J文档.doc Log4J文档.doc Log4J文档.doc

    log4j2.xml配置

    spring5取消Log4jConfigListener,运用Log4jServletContextListener代替Log4jConfigListener(log4j2.xml的配置)

Global site tag (gtag.js) - Google Analytics