什麼時候使用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

相關文章
相關標籤/搜索