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);
相关推荐
### Log4j2与Log4j效率对比 #### 测试环境与方法 为了准确评估Log4j2与Log4j之间的性能差异,通常会采用一套标准的效率测试程序。这类程序会模拟大量日志记录操作,并比较两种日志框架在处理相同负载时的性能表现...
**日志框架Log4j详解** 在Java编程中,日志记录是不可...理解和熟练使用Log4j,对于提升Java应用的调试和维护效率有着重要作用。在实际项目中,根据需求选择合适的配置和使用方式,可以使日志记录更加高效和有针对性。
而"工具"标签则表明Log4j是一个开发者常用的工具,它的使用和配置是提高开发效率的关键。 **压缩包文件名称列表** - `log4j-1.2.14.jar`: 这是Log4j 1.2.14版本的jar包,包含了Log4j的全部类和方法,是使用Log4j...
默认情况下,Log4j2使用同步模式记录日志,即每个日志事件都会阻塞直到写入完成。然而,通过启用异步日志模式,Log4j2会将日志事件放入一个队列,然后由一个单独的后台线程处理这些事件,从而避免了主线程的阻塞,...
在实际项目中,合理配置Log4j 2可以大大提高日志管理效率。理解并掌握XML、JSON或YAML配置文件的编写规则,以及如何在代码中初始化和使用Logger,是每个Java开发者必备的技能。 总之,logging-log4j2-log4j-2.15.0...
通过这份"Log4j2效率测试源码",开发者不仅可以了解到Log4j2的核心特性,还能学习如何进行日志性能测试,为实际项目中的日志管理提供依据和优化方案。在实际工作中,正确使用和优化Log4j2能够显著提高应用程序的性能...
总的来说,Log4j2Detect是应对Log4j漏洞的一款实用工具,它帮助开发者和系统管理员快速定位问题,提高安全响应效率。在日常运维中,我们应该时刻关注类似的安全事件,通过学习和使用这些工具,提升我们的安全防护...
本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j是一个开源的日志组件,支持多种输出格式,如控制台、文件、数据库等。它的核心概念包括Logger、...
2. **日志类**:在Java代码中,我们会创建一个日志类,通常会使用Log4j提供的`Logger`接口。在这个例子中,我们创建了一个名为`Log`的类,该类持有`Logger`实例并提供静态方法供其他类使用。 3. **初始化**:在`Log...
《深入理解log4j-api-2.17.1.jar与log4j-core-2.17.1.jar》 ...在实际项目中,合理地配置和使用Log4j2不仅可以提升日志管理的效率,还能在问题发生时快速定位,从而提高整体的开发效率和产品质量。
**日志框架Log4j详解** ...理解并熟练使用Log4j,能够有效提升开发效率,方便问题排查。通过阅读提供的"log4j使用方法"文档,你将能更深入地了解Log4j的配置和使用技巧,为你的开发工作带来便利。
#### 四、使用Log4j记录日志 1. **引入Log对象**: ```java protected final Log log = LogFactory.getLog(getClass()); ``` 在Java类中,需要引入Log对象以便记录日志信息。 2. **记录日志信息**: ```...
6. **自动化扫描**:使用工具如`log4j2_detect2.0_gui`可以自动化检测Log4j2的存在和版本,从而提高效率并减少人为错误。 7. **持续监控**:安全不是一次性任务,需要定期进行复查和监控,以应对可能出现的新漏洞。...
在Java应用开发中,正确配置和使用Log4j能极大地提高开发效率和维护性。 首先,我们需要理解Log4j的核心组件: 1. **Logger**:这是日志记录的起点,开发者通过Logger对象来创建和发送日志消息。你可以根据需要...
Log4j2是一款广泛使用的Java日志记录框架,它的核心在于提供高效、灵活的日志记录功能,便于开发者在应用程序中追踪错误、调试信息以及性能数据。这个压缩包包含的两个关键文件——`log4j-api-2.11.1.jar`和`log4j-...
Log4j-1.2.17是Log4j 1.x系列的一个稳定版本,尽管后续发布了Log4j 2.x,但1.2版仍被许多遗留系统和项目广泛使用。这个版本修复了一些已知的bug,提升了性能和稳定性,同时也兼容了当时的Java环境。 总结,Log4j...
Apache Log4j 是一个广泛使用的开源日志框架,它为Java应用程序提供了强大的日志记录功能。Log4j 的主要优点在于它的灵活性和可配置...理解并熟练运用Log4j的配置和使用方法,对于提升开发效率和维护质量有着重要作用。
无论是在小型项目还是大型企业级应用中,理解并熟练使用Log4j都能极大地提升开发效率和系统维护能力。然而,随着技术的发展,更现代的替代品如Logback和SLF4J已经出现,它们在性能和功能上有所提升,开发者也需要...
**日志框架Log4j详解** 在Java开发中,日志记录是一项不可或缺的功能,它能够帮助开发者追踪程序运行状态,定位错误,优化性能,并为后期维护提供重要信息。Log4j是Apache组织开发的一个强大的、灵活的日志记录框架...