经常在高并发下就遇到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
分享到:
相关推荐
log4j2.component.properties
Log4j2学习笔记,引入log4j2的依赖-log4j2.xml配置模板-application.properties文件配置-使用
log4j2.xml文件
使用log4j2.xml实现对日志的精准控制,对整个开发过程百利有之!但是也要也要注意使用的误区,具体可才看本博客下的Java异常和日志管理!
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.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...
关于配置文件的名称以及在项目中的存放位置 log4j 2.x版本不再支持像1.x中的....如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。
log4j2.properties,采用properties的方式配置log4j2。
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属性文件打包下载.
java 日志出入log4j配置文件(完整版和精简版) log4j.properties(完整版) log4j.properties(精简版)
log4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j.propertieslog4j....
演示了java记录通过log4j2记录日志到mysql数据库中
Log4j1.2.chm
log4j详解.txtlog4j详解.txt
log4j2.xml 应用级的配置文件 支持窗体输出、error、info、trace error和trace按照日生成和清理文件 info按照小时生成和清理文件
Log4J文档.doc Log4J文档.doc Log4J文档.doc Log4J文档.doc
spring5取消Log4jConfigListener,运用Log4jServletContextListener代替Log4jConfigListener(log4j2.xml的配置)