`
zhouzhao21
  • 浏览: 71617 次
  • 性别: 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

相关推荐

Global site tag (gtag.js) - Google Analytics