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

Log4j使用的效率二

阅读更多

1、效率

log4j关闭debug级别输出,但是在代码中log.debug(Object msg)的写法不同,将会多耗费3-5倍的时间。因此,要优化log.debug()这个方法的调用的,log.info()也是同理

2、log4j的优化简介

log4j做了大量的优化,比如:Log4j初始化时打开文件并保持对文件的写控制,直到进程结束时才关闭流。这样控制打开I/O次数

还有其他方面的优化,使用了大量缓存,参看debug方法源码

  public void debug(Object message) {
    if(repository.isDisabled(Level.DEBUG_INT))
      return;
    if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
      forcedLog(FQCN, Level.DEBUG, message, null);
    }
  }

设置输出级别为INFO时,调用debug()会直接返回。但在使用LOG.debug("business is" + xxxObj)时,虚拟机在debug方法执行前需要先将字符串进行连接,这就是俺们需要优化的地方。

3、效率编码及测试

下面上干货,fuck goods

测试工具类TestUtil 

package util;

public class TestUtil {
	/**
	 * 
	 * 测试函数使用时间,通过定义TestCallBack接口的execute方法
	 * 
	 * @param testCallBack
	 */
	public static long testTime(TestCallBack testCallBack) {
		long begin = System.currentTimeMillis(); // 测试起始时间
		testCallBack.execute(); // /进行回调操作
		long end = System.currentTimeMillis(); // 测试结束时间
		long cost = (end - begin);
		return cost;
	}
}

 回调函数

package util;

public interface TestCallBack {
	public void  execute();
}

 测试主类

package util;

import org.apache.log4j.Logger;

import util.TestCallBack;
import util.TestUtil;

public class EfficientTest {
	private final static Logger LOG = Logger.getLogger(EfficientTest.class);
	private final static int MAX_LOOP = 100 * 1000 * 1000;

	/**
	 * 正常写法
	 */
	public long log() {
		long cost = TestUtil.testTime(new TestCallBack() {
			@Override
			public void execute() {
				for (int i = 0; i < MAX_LOOP; i++) {
					/**
					 * "test" + "abc" + str的写法,会在运行时产生运算
					 */
					String str = "tt";
					LOG.debug("test" + "abc" + str);
					/**
					 * "test" + "abc"的写法,虚拟机在编译器会合并直接量,运行时并不会运算
					 */
					// LOG.debug("test" + "abc");
				}
			}
		});
		System.out.println("          cost:" + cost);
		return cost;
	}

	/**
	 * 效率写法
	 */
	public long logEfficient() {
		long cost = TestUtil.testTime(new TestCallBack() {
			@Override
			public void execute() {
				for (int i = 0; i < MAX_LOOP; i++) {
					if (LOG.isDebugEnabled()) {
						String str = "tt";
						LOG.debug("test" + "abc" + str);
						// LOG.debug("test" + "abc");
					}
				}
			}
		});
		System.out.println("efficient cost:" + cost);
		return cost;
	}

	public static void main(String[] args) {
		EfficientTest test = new EfficientTest();
		for (int i = 0; i <= 9; i++) {
			System.out.println("====我是华丽的分割线====" + i);
			if (i % 2 > 0) {
				long log = test.log();
				long logEfficient = test.logEfficient();
				System.out.println("log/logEfficient,"
						+ (((double) log / logEfficient) * 100.0)
						+ "% increase");
			} else {
				long logEfficient = test.logEfficient();
				long log = test.log();
				System.out.println("log/logEfficient,"
						+ (((double) log / logEfficient) * 100.0)
						+ "% increase");
			}
			// System.out.println();
		}
	}
}

 log4j配置类,把输出级别调整成INFO级别

log4j.rootCategory=INFO, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p [%t] %C.%M(%L) | %m%n

 运行后的结果

====我是华丽的分割线====0
efficient cost:434
          cost:2054
log/logEfficient,473.2718894009216% increase
====我是华丽的分割线====1
          cost:1822
efficient cost:434
log/logEfficient,419.8156682027649% increase
====我是华丽的分割线====2
efficient cost:394
          cost:1823
log/logEfficient,462.69035532994917% increase
====我是华丽的分割线====3
          cost:1805
efficient cost:400
log/logEfficient,451.25% increase
====我是华丽的分割线====4
efficient cost:400
          cost:1805
log/logEfficient,451.25% increase
====我是华丽的分割线====5
          cost:1790
efficient cost:396
log/logEfficient,452.02020202020196% increase
====我是华丽的分割线====6
efficient cost:397
          cost:1798
log/logEfficient,452.89672544080605% increase
====我是华丽的分割线====7
          cost:1786
efficient cost:393
log/logEfficient,454.45292620865143% increase
====我是华丽的分割线====8
efficient cost:401
          cost:1969
log/logEfficient,491.0224438902743% increase
====我是华丽的分割线====9
          cost:1801
efficient cost:392
log/logEfficient,459.4387755102041% increase

优化效果显而易见,关闭DEBUG级别的日志后,log.debug方法的写法不同,造成运行时间也不同

 

4、类似的方法

除了

LOG.isDebugEnabled()

 还有

LOG.isInfoEnabled()

 还有

LOG.isEnabledFor(Priority.DEBUG);

 

 

 Log4j的HelloWorld 在javaSE中入门使用一

 Log4j使用的效率二

 Log4j的输出格式三

 Log4j将System.out搞到log4j中输出四

0
0
分享到:
评论

相关推荐

    Log4j2简介及与Log4j效率对比

    ### Log4j2与Log4j效率对比 #### 测试环境与方法 为了准确评估Log4j2与Log4j之间的性能差异,通常会采用一套标准的效率测试程序。这类程序会模拟大量日志记录操作,并比较两种日志框架在处理相同负载时的性能表现...

    log4j使用教程(详解)

    **日志框架Log4j详解** 在Java编程中,日志记录是不可...理解和熟练使用Log4j,对于提升Java应用的调试和维护效率有着重要作用。在实际项目中,根据需求选择合适的配置和使用方式,可以使日志记录更加高效和有针对性。

    log4j简单使用

    而"工具"标签则表明Log4j是一个开发者常用的工具,它的使用和配置是提高开发效率的关键。 **压缩包文件名称列表** - `log4j-1.2.14.jar`: 这是Log4j 1.2.14版本的jar包,包含了Log4j的全部类和方法,是使用Log4j...

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

    默认情况下,Log4j2使用同步模式记录日志,即每个日志事件都会阻塞直到写入完成。然而,通过启用异步日志模式,Log4j2会将日志事件放入一个队列,然后由一个单独的后台线程处理这些事件,从而避免了主线程的阻塞,...

    logging-log4j2-log4j-2.15.0-rc2.zip

    在实际项目中,合理配置Log4j 2可以大大提高日志管理效率。理解并掌握XML、JSON或YAML配置文件的编写规则,以及如何在代码中初始化和使用Logger,是每个Java开发者必备的技能。 总之,logging-log4j2-log4j-2.15.0...

    Log4j2效率测试源码

    通过这份"Log4j2效率测试源码",开发者不仅可以了解到Log4j2的核心特性,还能学习如何进行日志性能测试,为实际项目中的日志管理提供依据和优化方案。在实际工作中,正确使用和优化Log4j2能够显著提高应用程序的性能...

    log4j2_detect_gui.zip

    总的来说,Log4j2Detect是应对Log4j漏洞的一款实用工具,它帮助开发者和系统管理员快速定位问题,提高安全响应效率。在日常运维中,我们应该时刻关注类似的安全事件,通过学习和使用这些工具,提升我们的安全防护...

    log4j使用jar包和log4j.properties配置文件

    本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j是一个开源的日志组件,支持多种输出格式,如控制台、文件、数据库等。它的核心概念包括Logger、...

    log4j使用与java中log4j记录日志如何写入数据库

    2. **日志类**:在Java代码中,我们会创建一个日志类,通常会使用Log4j提供的`Logger`接口。在这个例子中,我们创建了一个名为`Log`的类,该类持有`Logger`实例并提供静态方法供其他类使用。 3. **初始化**:在`Log...

    log4j-api-2.17.1.jar和log4j-core-2.17.1.jar

    《深入理解log4j-api-2.17.1.jar与log4j-core-2.17.1.jar》 ...在实际项目中,合理地配置和使用Log4j2不仅可以提升日志管理的效率,还能在问题发生时快速定位,从而提高整体的开发效率和产品质量。

    log4j使用详细方法

    **日志框架Log4j详解** ...理解并熟练使用Log4j,能够有效提升开发效率,方便问题排查。通过阅读提供的"log4j使用方法"文档,你将能更深入地了解Log4j的配置和使用技巧,为你的开发工作带来便利。

    如何使用Log4j如何使用Log4j

    #### 四、使用Log4j记录日志 1. **引入Log对象**: ```java protected final Log log = LogFactory.getLog(getClass()); ``` 在Java类中,需要引入Log对象以便记录日志信息。 2. **记录日志信息**: ```...

    扫描log4j2 版本扫描log4j2 版本

    6. **自动化扫描**:使用工具如`log4j2_detect2.0_gui`可以自动化检测Log4j2的存在和版本,从而提高效率并减少人为错误。 7. **持续监控**:安全不是一次性任务,需要定期进行复查和监控,以应对可能出现的新漏洞。...

    log4j使用jar文件

    在Java应用开发中,正确配置和使用Log4j能极大地提高开发效率和维护性。 首先,我们需要理解Log4j的核心组件: 1. **Logger**:这是日志记录的起点,开发者通过Logger对象来创建和发送日志消息。你可以根据需要...

    log4j2所需jar包

    Log4j2是一款广泛使用的Java日志记录框架,它的核心在于提供高效、灵活的日志记录功能,便于开发者在应用程序中追踪错误、调试信息以及性能数据。这个压缩包包含的两个关键文件——`log4j-api-2.11.1.jar`和`log4j-...

    log4j jar包

    Log4j-1.2.17是Log4j 1.x系列的一个稳定版本,尽管后续发布了Log4j 2.x,但1.2版仍被许多遗留系统和项目广泛使用。这个版本修复了一些已知的bug,提升了性能和稳定性,同时也兼容了当时的Java环境。 总结,Log4j...

    apache log4j使用大全

    Apache Log4j 是一个广泛使用的开源日志框架,它为Java应用程序提供了强大的日志记录功能。Log4j 的主要优点在于它的灵活性和可配置...理解并熟练运用Log4j的配置和使用方法,对于提升开发效率和维护质量有着重要作用。

    log4j-1.2.15.jar

    无论是在小型项目还是大型企业级应用中,理解并熟练使用Log4j都能极大地提升开发效率和系统维护能力。然而,随着技术的发展,更现代的替代品如Logback和SLF4J已经出现,它们在性能和功能上有所提升,开发者也需要...

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

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

Global site tag (gtag.js) - Google Analytics