`
zhouzhao21
  • 浏览: 72667 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

log4j 性能问题

阅读更多
以前使用 log4j 时有条性能教条:
在使用 log 之前,使用 isXXXEnabled() 函数来判断日志等级以提高程序性能。
不记得在哪看到讲现在的 log4j 版本不需要使用 isXXXEnabled() 函数来改进性能了。现在也找不到出处,看了下 log4j 代码(version 1.2.15),如下:
  public
  boolean isDebugEnabled() {
    if(repository.isDisabled( Level.DEBUG_INT))
      return false;
    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
  }



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

看来确实是不需要使用 isXXXEnabled() 函数来改进性能了。大家认为呢?
分享到:
评论
7 楼 zhouzhao21 2009-10-26  
NanguoCoffee 写道
为啥不看官方文档?使用 isXXXEnabled() 函数来改进性能的原因在官方文档中说得非常清楚。


不好意思,没想到 API 上也会把这个写上去。主要是我以前好像看过有一出处讲“不需要使用 isXXXEnabled 方法”。
看了 API 说明(http://logging.apache.org/log4j/1.2/apidocs/index.html   org.apache.log4j.Category) ,的确是如 quaff 所讲。
6 楼 fallen_lord 2009-10-25  
xiaoych 写道
quaff 写道
zhouzhao21 写道
以前使用 log4j 时有条性能教条:
在使用 log 之前,使用 isXXXEnabled() 函数来判断日志等级以提高程序性能。
不记得在哪看到讲现在的 log4j 版本不需要使用 isXXXEnabled() 函数来改进性能了。现在也找不到出处,看了下 log4j 代码(version 1.2.15),如下:
  public
  boolean isDebugEnabled() {
    if(repository.isDisabled( Level.DEBUG_INT))
      return false;
    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
  }



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

看来确实是不需要使用 isXXXEnabled() 函数来改进性能了。大家认为呢?

isXXXEnabled() 是为了避免大量的拼接字符串

if(isDebugEnabled())
log.debug("error:"+error);

这里可以避免执行"error:"+error


JDK5以后,已经不存在这个问题了。
可以看看反编译以后的源代码,编译的时候对+进行优化了。


关键不是字符串拼接,而是避免可能的任何没有必要的消耗性能的操作
5 楼 xiaoych 2009-10-24  
quaff 写道
zhouzhao21 写道
以前使用 log4j 时有条性能教条:
在使用 log 之前,使用 isXXXEnabled() 函数来判断日志等级以提高程序性能。
不记得在哪看到讲现在的 log4j 版本不需要使用 isXXXEnabled() 函数来改进性能了。现在也找不到出处,看了下 log4j 代码(version 1.2.15),如下:
  public
  boolean isDebugEnabled() {
    if(repository.isDisabled( Level.DEBUG_INT))
      return false;
    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
  }



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

看来确实是不需要使用 isXXXEnabled() 函数来改进性能了。大家认为呢?

isXXXEnabled() 是为了避免大量的拼接字符串

if(isDebugEnabled())
log.debug("error:"+error);

这里可以避免执行"error:"+error


JDK5以后,已经不存在这个问题了。
可以看看反编译以后的源代码,编译的时候对+进行优化了。
4 楼 NanguoCoffee 2009-10-23  
为啥不看官方文档?使用 isXXXEnabled() 函数来改进性能的原因在官方文档中说得非常清楚。

zhouzhao21 写道
以前使用 log4j 时有条性能教条:
在使用 log 之前,使用 isXXXEnabled() 函数来判断日志等级以提高程序性能。
不记得在哪看到讲现在的 log4j 版本不需要使用 isXXXEnabled() 函数来改进性能了。现在也找不到出处,看了下 log4j 代码(version 1.2.15),如下:
  public
  boolean isDebugEnabled() {
    if(repository.isDisabled( Level.DEBUG_INT))
      return false;
    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
  }



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

看来确实是不需要使用 isXXXEnabled() 函数来改进性能了。大家认为呢?

3 楼 topolog 2009-10-23  
<p>用 <a href="http://www.slf4j.org/manual.html" target="_blank"> slf4j </a>更方便,支持parameterized messages<br></p>
<pre name="code" class="java">Object entry = new SomeObject();
logger.debug("The entry is {}.", entry);
</pre>
<p> </p>
<p> </p>
2 楼 zhouzhao21 2009-10-23  
感谢楼上,受教了。
1 楼 quaff 2009-10-23  
zhouzhao21 写道
以前使用 log4j 时有条性能教条:
在使用 log 之前,使用 isXXXEnabled() 函数来判断日志等级以提高程序性能。
不记得在哪看到讲现在的 log4j 版本不需要使用 isXXXEnabled() 函数来改进性能了。现在也找不到出处,看了下 log4j 代码(version 1.2.15),如下:
  public
  boolean isDebugEnabled() {
    if(repository.isDisabled( Level.DEBUG_INT))
      return false;
    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
  }



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

看来确实是不需要使用 isXXXEnabled() 函数来改进性能了。大家认为呢?

isXXXEnabled() 是为了避免大量的拼接字符串

if(isDebugEnabled())
log.debug("error:"+error);

这里可以避免执行"error:"+error

相关推荐

    Log4j2简介及与Log4j效率对比

    与Log4j 1.x相比,Log4j2在设计上进行了重大改进,并解决了Logback等其他日志框架中存在的某些体系结构问题。 #### 特性概述 1. **审计功能**:Log4j2设计时考虑到了审计需求,这意味着即使在配置更新过程中,它也...

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

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

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    Log4j2作为Log4j的升级版本,它在性能、可配置性和可扩展性上有了显著提升,同时也修复了Log4j的一些已知问题。Fastjson则是阿里巴巴的一个开源项目,它提供了快速的JSON解析和生成性能,广泛应用于Java应用程序的...

    SpringBoot框架配置log4j和log4j2的配置代码

    Log4j和Log4j2是两种广泛使用的Java日志框架,它们提供了灵活的日志配置和高性能的日志处理能力。本文将详细介绍如何在SpringBoot项目中配置Log4j和Log4j2。 ### SpringBoot与Log4j Log4j是Apache的一个开源项目,...

    log4j各个版本

    Log4j的各个版本在功能、性能和安全性方面都有所不同,下面将详细介绍这些版本及其特点。 1. Log4j 1.2.6:这是Log4j的一个较早版本,提供了基本的日志记录功能,包括定义不同级别的日志(如DEBUG、INFO、WARN、...

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

    Log4j是Apache软件基金会开发的一个用于Java应用程序的日志记录工具,它提供了灵活的日志记录功能,有助于调试、性能分析和系统监控。"API"(Application Programming Interface)通常指的是开发者用来与库或框架...

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

    此外,Log4j2还引入了异步日志记录,通过使用LMAX Disruptor库来提高性能,尤其是在高并发环境中。 2.17.1版本的更新主要是为了修复安全漏洞。在2021年底,Log4j2被发现存在一个严重漏洞(CVE-2021-44228),这个远程...

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

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

    log4j示例项目

    通过这个"log4j示例项目",我们可以亲手实践这些概念,更好地理解和运用Log4j,从而在实际开发中有效地利用日志进行问题排查和系统监控。在项目中的`logtest`文件可能包含了实现这些功能的示例代码,值得我们详细...

    logging-log4j2-log4j-2.15.0-rc2.zip

    相较于Log4j 1.x,Log4j 2不仅在性能上有所增强,而且在用户体验和安全性上都有显著改进。 2. **版本2.15.0-rc2的更新**: - **安全补丁**:此版本主要针对CVE-2021-44228的安全漏洞进行了修复,这是一个非常严重...

    log4j-1.2.15.jar

    1. **稳定性与兼容性**:Log4j 1.2.15是一个稳定版本,修复了前一版本中的多个已知问题,确保了与其他系统的良好兼容性。 2. **配置灵活性**:通过配置文件(通常为log4j.properties或log4j.xml),开发者可以灵活...

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

    Log4j是一个广泛使用的Java日志记录框架,它允许开发者在应用程序中插入日志语句,以便跟踪程序的运行情况、调试错误、监控性能等。这个框架由Apache软件基金会开发,是许多Java项目的首选日志解决方案,因为它具有...

    log4j jar包

    《深入理解Log4j:Apache日志框架的基石》 在Java编程领域,日志记录是不可或缺的一部分,它为开发者提供了程序运行时的...然而,随着技术的发展,建议关注更新的Log4j 2.x版本,以利用其更先进的特性和更好的性能。

    logging-log4j2-log4j-2.16.0-rc1.zip

    总的来说,"logging-log4j2-log4j-2.16.0-rc1.zip"的发布是Log4j团队对"Log4Shell"漏洞的有力回应,通过禁用可能导致安全问题的功能,提高了整体的安全标准。这一事件提醒我们,安全无小事,及时的更新和维护是保障...

    Log4j2学习log4j2.xml配置模板

    *高性能:Log4j2具有非常高的性能,可以handle大量的日志信息。 *灵活的appender:Log4j2 提供了多种appender,例如控制台 appender、文件 appender 和 rolling 文件 appender,等等。 *可扩展性强:Log4j2 提供了...

    log4j-1.2.16下载

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

    log4j实用配置扩展

    #### 四、log4j的核心组件 log4j的核心组件主要包括**Loggers(记录器)**、**Appenders(输出源)**和**Layouts(布局)**。 1. **Loggers (记录器)**:负责生成日志信息,并决定是否发送日志信息到Appenders。记录器...

    log4j各版本jar包

    《log4j各版本详解与应用》 在Java开发领域,日志管理是不可或...了解并熟练使用不同版本的Log4j,有助于提升代码的可维护性和问题排查效率。在选择和使用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 Demo性能测试:探索异步日志的魅力》 在软件开发过程中,日志记录是一项至关重要的任务,它可以帮助开发者追踪程序运行状态、定位问题以及进行性能优化。Log4j2作为Java领域广泛使用的日志框架,...

Global site tag (gtag.js) - Google Analytics