论坛首页 Java企业应用论坛

log4j 性能问题

浏览 4884 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-10-23   最后修改:2009-10-23
以前使用 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() 函数来改进性能了。大家认为呢?
   发表时间: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
0 请登录后投票
   发表时间:2009-10-23  
感谢楼上,受教了。
0 请登录后投票
   发表时间:2009-10-23  

slf4j 更方便,支持parameterized messages

Object entry = new SomeObject();
logger.debug("The entry is {}.", entry);

 

 

0 请登录后投票
   发表时间: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() 函数来改进性能了。大家认为呢?

0 请登录后投票
   发表时间: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以后,已经不存在这个问题了。
可以看看反编译以后的源代码,编译的时候对+进行优化了。
0 请登录后投票
   发表时间: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以后,已经不存在这个问题了。
可以看看反编译以后的源代码,编译的时候对+进行优化了。


关键不是字符串拼接,而是避免可能的任何没有必要的消耗性能的操作
0 请登录后投票
   发表时间:2009-10-26  
NanguoCoffee 写道
为啥不看官方文档?使用 isXXXEnabled() 函数来改进性能的原因在官方文档中说得非常清楚。


不好意思,没想到 API 上也会把这个写上去。主要是我以前好像看过有一出处讲“不需要使用 isXXXEnabled 方法”。
看了 API 说明(http://logging.apache.org/log4j/1.2/apidocs/index.html   org.apache.log4j.Category) ,的确是如 quaff 所讲。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics