`
kangzhanlei
  • 浏览: 4103 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

log4j性能优化

    博客分类:
  • java
 
阅读更多

在log4j1.2的版本里,发现有两把性能低下的锁,一把就是在Category的callAppender方法里,代码如下

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

  为了防止在记录日志的时候appender被更新,所以加了一把独占锁,如果一个线程正在记录日志,那么其他线程用到了这个logger的都会在这里等待,从实际运行情况来看,很少有经常变动的appender,所以这种情况依然是读多写少,个人觉得极其适合用ReentrantReadWriteLock来处理,把synchronized换成读锁,在addAppender或者removeAppender上增加写锁,这样就很大程度上避免了锁竞争,事实上最新版的log4j就替换为了读写锁,只不过是用来非重入的读写锁。改完之后性能大幅度提高了。修改后的代码如下

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

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

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

 

另一个锁在AppenderSkeleton的doAppend方法上,因为大部分appender都从这里派生,真正执行写任务的都在子类,但是框架义无反顾地走doAppend上加了一把锁,无论子类用不用锁,都已经锁上了。所以如果子类无需并发处理的时候,可以重写了doAppend方法,去掉这把锁,这样性能又会大幅度提高。

	public synchronized void doAppend(LoggingEvent event) {
		if (closed) {
			LogLog.error("Attempted to append to closed appender named ["
					+ name + "].");
			return;
		}

		if (!isAsSevereAsThreshold(event.getLevel())) {
			return;
		}

		Filter f = this.headFilter;

		FILTER_LOOP: while (f != null) {
			switch (f.decide(event)) {
				case Filter.DENY:
					return;
				case Filter.ACCEPT:
					break FILTER_LOOP;
				case Filter.NEUTRAL:
					f = f.next;
			}
		}

		this.append(event);
	}
 

 

修改了这2把锁后,性能就很高了,其实没必要对日志做异步处理,异步处理的伸缩性做的好不好,以及他的饥饿策略等等,都有可能带来不理想的结果。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Log4j2简介及与Log4j效率对比

    10. **优化的并发支持**:Log4j2利用Java 5提供的并发特性,能够在较低级别上执行锁定操作,有效避免了Log4j 1.x中出现的死锁问题。 ### Log4j2与Log4j效率对比 #### 测试环境与方法 为了准确评估Log4j2与Log4j...

    log4j-api-2.12.4.ja和log4j-core-2.12.4.jar

    **log4j-core-2.12.4.jar** 则是Log4j 2的核心实现模块,它实现了API模块中定义的接口,并负责实际的日志记录工作,包括日志事件的处理、输出格式化、日志存储以及性能优化等功能。此外,核心模块还包含了一些附加...

    logging-log4j2-log4j-2.15.0-rc2.zip

    - **性能优化**:持续的性能优化是Log4j 2的核心之一,新版本可能包含了对日志处理速度的提升,使得在高并发场景下,日志记录依然能保持流畅。 3. **核心组件**: - **Layouts**:定义了日志事件的输出格式,如...

    log4j-1.2.15.jar

    5. **性能优化**:Log4j 1.2.15针对性能进行了优化,尤其是在高并发环境下的表现,降低了日志处理的开销。 三、使用Log4j 1.2.15.jar 1. **引入依赖**:在项目中添加Log4j 1.2.15.jar依赖,可以手动下载放入类路径...

    log4j-API-最新稳定版本log4j-1.2.17

    **标题与描述解析** 标题提及的是"log4j-API-最新稳定版本log4j-1.2.17",这表明我们关注的是日志框架...对于使用Log4j的开发者来说,理解和掌握API的各个方面至关重要,以实现有效的日志管理并优化应用程序的监控。

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

    **日志框架Log4j详解** 在Java开发中,日志记录是一项不可或缺的功能,它能够帮助开发者追踪程序运行状态,定位错误,优化性能,并为后期维护提供重要信息。Log4j是Apache组织开发的一个强大的、灵活的日志记录框架...

    log4j示例项目

    性能优化** 在大型系统中,日志记录可能对性能有影响。Log4j允许我们在运行时动态调整日志级别,避免不必要的日志输出,提高系统性能。 **6. 扩展与集成** 除了基本的日志功能,Log4j还支持与其他日志框架(如...

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

    这不仅有助于问题排查,也有利于系统维护和性能优化,因为过多的日志可能会占用大量磁盘空间,影响系统性能。 总的来说,Log4j是一个强大且灵活的日志工具,对于任何Java开发项目来说都是必不可少的组件。它通过`...

    log4j jar包

    《深入理解Log4j:Apache日志框架的基石》 ...了解并熟练掌握Log4j的使用,有助于提升开发效率,优化系统的可维护性。然而,随着技术的发展,建议关注更新的Log4j 2.x版本,以利用其更先进的特性和更好的性能。

    logging-log4j2-log4j-2.16.0-rc1.zip

    4. **性能优化**:虽然安全是此次更新的首要目标,但开发团队也对性能进行了优化,确保在增强安全的同时不影响系统的正常运行。 5. **兼容性检查**:2.16.0-rc1版本考虑到与先前版本的兼容性,以确保升级过程尽可能...

    log4j各版本jar包

    这些版本之间的差异主要体现在功能增强、性能优化和安全修复上。例如,从1.2.12到1.2.13的升级,可能修复了一些已知的bug,增强了稳定性;而从1.2.16到1.2.17的更新,可能会对某些关键功能进行了改进或增加了新的...

    log4j实用配置扩展

    总之,log4j作为一种强大的日志管理工具,不仅能够提高应用程序的可维护性和可扩展性,还能够帮助开发者更高效地进行故障排查和性能优化。对于任何涉及大量数据处理或复杂逻辑的应用程序而言,正确配置并使用log4j都...

    log4j-1.2.16下载

    四、Log4j-1.2.16的优化与维护 1. **日志级别管理**:在生产环境中,通常会将日志级别设置为WARN或ERROR,以减少不必要的日志输出,提高性能。 2. **日志分割**:为了便于管理和分析,可以配置Log4j按日期分割日志...

    日志版本-log4j2版本jar

    Log4j是Apache的一个开源项目,提供了一套强大的日志API,而Log4j2是其升级版,旨在解决Log4j1.x存在的性能问题和设计缺陷。 Log4j2的核心改进在于其引入了全新的API——Log4j 1.2 API,文件`log4j-1.2-api-2.8.2....

    log4j2 demo 性能测试

    在软件开发过程中,日志记录是一项至关重要的任务,它可以帮助开发者追踪程序运行状态、定位问题以及进行性能优化。Log4j2作为Java领域广泛使用的日志框架,以其高效、灵活的特点深受青睐。本文将基于"Log4j2 Demo...

    Log4j2异步写日志效率测试源码

    在实际应用中,我们还可以调整Log4j2的异步配置,例如设置队列大小、选择不同的Appender实现(如FileAppender、ConsoleAppender等)以及日志级别,以优化日志性能和存储需求。此外,Log4j2的AsyncAppender利用了LMAX...

    log4j-1.2.17.jar下载

    四、使用Log4j进行日志记录 在Java代码中,我们通过创建Logger实例来记录日志。例如: ```java import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = Logger....

    log4j-2.17.1的jar包,导入即可使用

    这个"**log4j-2.17.1**"的版本是该框架的一个更新,提供了修复的安全漏洞和性能优化。以下是关于Log4j 2.17.1的一些关键知识点: 1. **日志框架**:Log4j 是Apache软件基金会的一个项目,它为Java应用程序提供了一...

    log4j所依赖jar包

    Log4j是一个广泛使用的Java日志框架,由Apache软件基金会开发。它为应用程序提供了一种灵活的日志记录机制,使得开发者...在实际操作中,开发者还需要理解Log4j的配置和使用方法,以充分利用其功能并优化日志处理流程。

    log4j按功能保存日志

    5. **性能优化** - 为了提高性能,避免不必要的日志输出,应合理设置日志级别。DEBUG级别信息只在调试时开启,生产环境中通常使用INFO或更高的级别。 - 使用异步Appender可以提高日志记录效率,防止日志输出对应用...

Global site tag (gtag.js) - Google Analytics