什么时候使用log4j的isDebugEnabled属性来进行日志记录?

我常常见到这个问题,到底使不使用idDebugEnabled属性。这个问题常常被争论,而焦点每每是性能。 apache

答案很简单。既然有这个属性,固然是拿来使用的。可是使用的时候须要注意。 性能优化

例如,在个人代码中,我以下使用。 性能

Java代码
  1. log.debug("I am there");  

这个例子是一个好的实践。 优化

然而若是我按照以下的方式来使用,我以为就是没必要要的了。
  this

Java代码
  1. // Not good practise   
  2. if (log.isDebugEnabled()){   
  3.     log.debug("I am there");    
  4. }   

那么是为何呢?这是由于类Category中的debug方法(由Log4j库的Logger类继承)已经检查了日志中的模式(即当前的日志级别)。org.apache.log4j.Category类中debug的代码以下: spa

Java代码
  1. public void debug(Object message) {   
  2. if(repository.isDisabled(Level.DEBUG_INT))   
  3. return;   
  4. if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {   
  5. forcedLog(FQCN, Level.DEBUG, message, null);   
  6. }   
  7. }   

所以上面的例子中,咱们能够不使用它来判断。那么何时须要使用isDebugEnabled属性呢? debug

例如,你有一个很 长的参数要在debug模式下输出: 日志

Java代码
  1. // Bad Practise   
  2.  log.debug("XML "+Tree.getXMLText());   

在这样的状况下,能够清楚的说,不要使用它。若是Tree.getXMLText方法从App中获取出来,可是没有使用的话,这样对性能会有很大的影响。所以,应该按照以下的方式来使用: 继承

Java代码
  1. // Good Practise   
  2. if (log.isDebugEnabled()){   
  3.     log.debug("XML "+Tree.getXMLText());   
  4. }  

所以,在上面的例子中,使用log.isDebugEnabled()能够保证性能优化。 get

相关文章
相关标签/搜索