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

以前知道这个问题,但没有去了解它,这次看到一个网页,说明了事实的真相,所以转载过来。

 

===============================================================

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

答案很简单。既然有这个属性,当然是拿来使用的。但是使用的时候需要注意。

例如,在我的代码中,我如下使用。

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

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

然而如果我按照如下的方式来使用,我觉得就是不必要的了。

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的代码如下:

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模式下输出:

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()可以保证性能优化。

 

你可能感兴趣的:(何时使用log4j的isDebugEnabled属性来进行日志记录?)