Log4j的isdebugEnabled的做用

轉自:https://www.iteye.com/blog/zhukewen-java-1174017java

在項目中咱們常常能夠看到這樣的代碼:併發

 

if (logger.isDebugEnabled()) {性能

    logger.debug(message);this

}debug

 

    有些人不明白爲何要這樣寫。有些人認爲這樣是爲了可以控制日誌的輸出,對於下面這行代碼,日誌

 

 

 logger.debug(message);blog

 

 

    他們的見解是:若是這樣寫的話,就算你把日誌級別調整爲info, 這裏也會輸出日誌。開發

 

    其實,在debug()方法裏面,就已經叛斷了日誌的級別。如下是isDebugEnabled()的源碼:get

 

 

 

public boolean isDebugEnabled() {    源碼

  if(repository.isDisabled( Level.DEBUG_INT))

      return false;

    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());

  }

 

 

    如下是debug()的源碼:

      public void debug(Object message) {

    if(repository.isDisabled(Level.DEBUG_INT))

      return;

    if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {

      forcedLog(FQCN, Level.DEBUG, message, null);

    }

  }

 

 

     咱們能夠看到,在debug()方法裏作了跟isDebugEnabled()方法同樣的判斷。

    在這裏,咱們不由會想,那咱們凡是要輸日誌的地方,都不判斷isDebugEnabled,直接調debug方法,不更省事嗎?

    官方的說法是:出於效率考慮,看具體狀況而定.

    咱們來看下面一行代碼:

        logger.debug("The money is " + getTotalMoney());

假設咱們的日誌級別設置爲info,那這句話不會輸出日誌,但這個方法仍是會調用。要調用這個方法,必須提供參數。getTotalMoney()方法返回的結果就是參數的一部分。假設getTotalMoney()要執行10秒鐘,10秒鐘後,進入到debug()方法裏,碰到了第一個判斷:

 

if(repository.isDisabled(Level.DEBUG_INT))

      return;

 

 在這裏就返回了。結果是日誌雖然沒有輸出,卻花費了10秒鐘來構造參數。很顯然這裏得不償失的。儘管實際應用中幾乎不可能有這種花10秒鐘來構造這樣一個參數的狀況,但若是併發數大的話,這樣寫仍是會影響系統的性能的。這個時候,就應該寫成:

 

if(logger.isDebugEnabled()){

logger.debug("The money is " + getTotalMoney());

 若是debug的參數很簡單的話,也能夠直接寫 logger.debug(message)的。官方的說法,執行一次logger.isDebugEnabled()這樣的判斷花費的時間大概是寫日誌時間的萬分之一.雖然這個比例很小,

  可是,程序中的任何地方放到併發的環境下,咱們就得從新考慮了。

  因此,我以爲,咱們開發的時候, 應該視具體的狀況選擇不一樣的寫法。

  第一次在這裏發文,雖然本身技術很菜,但醜媳婦總歸是要見家娘,技術應是百花爭嗚,不該一家獨大,不然全世界就只能是那幾個大拿寫技術文章了。在這寫寫本身心得,交流交流技術, 引引玉,總歸是件有意義的事。

相關文章
相關標籤/搜索