轉自: http://huangxx.iteye.com/blog/190693
在使用log4j,common-log這樣的log框架時,發現很多代碼中這樣寫
if (log.isDebugEnabled()) {
log.debug( "xxxx ");
}
我很奇怪,為什么要與log.isDebugEnabled()?既然log.debug()在沒有指定輸出級別為DEBUG時不會有輸出,為什么還要在前面加一個isDebugEnabled()的判斷?
為了效率,如果上述那個代碼那么簡單是沒有必要的 但是如果這樣 if (log.isDebugEnabled()) { log.debug(buildFullString()); } 如果這個buildFullString效率不太高,那么如果直接寫log.debug(buildFullString());的話 雖然它不會打印語句,但是buildFullString還是被執行了,這樣就白費了功夫 所以加上isDebugEnabled就可以避免執行buildFullString了 這個方法一般用在認為buildFullString這個函數效率不太高的情況下
在log.debug("****")的時候,會先去構造參數的執行結果。如果參數是一個函數表達式,則先回執行函數,然后再判斷是否是debug級別。根據debug級別選擇是否輸出結果。
public void debug(Object message, Throwable t) { if(!this.repository.isDisabled(10000)) { if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) { this.forcedLog(FQCN, Level.DEBUG, message, t); } } }
這是log4j中的debug源碼,假設我們的代碼是:
log.debug(buildDebugInfo());
.........
buildDebugInfo()
{
doMuchThings();
}
log.debug(buildDebugInfo());在執行的時候,需要先執行buildDebugInfo(),將執行結果傳入到debug()中的message參數中,然后才判斷是否需要打印。