Log4j的isdebugEnabled的作用
在項目中我們經常可以看到這樣的代碼:
?
if (logger.isDebugEnabled()) {
?? ?logger.debug(message);
}
?
?? ?有些人不明白為什么要這樣寫。有些人認為這樣是為了能夠控制日志的輸出,對于下面這行代碼,
?
?
?logger.debug(message);
?
?
?? ?他們的看法是:如果這樣寫的話,就算你把日志級別調整為info, 這里也會輸出日志。
?
?? ?其實,在debug()方法里面,就已經叛斷了日志的級別。以下是isDebugEnabled()的源碼:
?
?
?
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()這樣的判斷花費的時間大概是寫日志時間的萬分之一.雖然這個比例很小,
??但是,程序中的任何地方放到并發的環境下,我們就得重新考慮了。
??所以,我覺得,我們開發的時候, 應該視具體的情況選擇不同的寫法。
??第一次在這里發文,雖然自己技術很菜,但丑媳婦總歸是要見家娘,技術應是百花爭嗚,不應一家獨大,否則全世界就只能是那幾個大拿寫技術文章了。在這寫寫自己心得,交流交流技術, 引引玉,總歸是件有意義的事。
from:?http://zhukewen-java.iteye.com/blog/1174017
總結
以上是生活随笔為你收集整理的Log4j的isdebugEnabled的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java异常的栈轨迹(Stack Tra
- 下一篇: isInfoEnabled究竟多有用?