Log4j的isdebugEnabled的作用
在項(xiàng)目中我們經(jīng)常可以看到這樣的代碼:
?
if (logger.isDebugEnabled()) {
?? ?logger.debug(message);
}
?
?? ?有些人不明白為什么要這樣寫。有些人認(rèn)為這樣是為了能夠控制日志的輸出,對(duì)于下面這行代碼,
?
?
?logger.debug(message);
?
?
?? ?他們的看法是:如果這樣寫的話,就算你把日志級(jí)別調(diào)整為info, 這里也會(huì)輸出日志。
?
?? ?其實(shí),在debug()方法里面,就已經(jīng)叛斷了日志的級(jí)別。以下是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()方法一樣的判斷。
?? ?在這里,我們不禁會(huì)想,那我們凡是要輸日志的地方,都不判斷isDebugEnabled,直接調(diào)debug方法,不更省事嗎?
?? ?官方的說法是:出于效率考慮,看具體情況而定.
?? ?我們來看下面一行代碼:
?? ? ? ?logger.debug("The money is " + getTotalMoney());
假設(shè)我們的日志級(jí)別設(shè)置為info,那這句話不會(huì)輸出日志,但這個(gè)方法還是會(huì)調(diào)用。要調(diào)用這個(gè)方法,必須提供參數(shù)。getTotalMoney()方法返回的結(jié)果就是參數(shù)的一部分。假設(shè)getTotalMoney()要執(zhí)行10秒鐘,10秒鐘后,進(jìn)入到debug()方法里,碰到了第一個(gè)判斷:
?
if(repository.isDisabled(Level.DEBUG_INT))
?? ? ?return;
?
?在這里就返回了。結(jié)果是日志雖然沒有輸出,卻花費(fèi)了10秒鐘來構(gòu)造參數(shù)。很顯然這里得不償失的。盡管實(shí)際應(yīng)用中幾乎不可能有這種花10秒鐘來構(gòu)造這樣一個(gè)參數(shù)的情況,但如果并發(fā)數(shù)大的話,這樣寫還是會(huì)影響系統(tǒng)的性能的。這個(gè)時(shí)候,就應(yīng)該寫成:
?
if(logger.isDebugEnabled()){
logger.debug("The money is " + getTotalMoney());
}?
?如果debug的參數(shù)很簡(jiǎn)單的話,也可以直接寫 logger.debug(message)的。官方的說法,執(zhí)行一次logger.isDebugEnabled()這樣的判斷花費(fèi)的時(shí)間大概是寫日志時(shí)間的萬分之一.雖然這個(gè)比例很小,
??但是,程序中的任何地方放到并發(fā)的環(huán)境下,我們就得重新考慮了。
??所以,我覺得,我們開發(fā)的時(shí)候, 應(yīng)該視具體的情況選擇不同的寫法。
??第一次在這里發(fā)文,雖然自己技術(shù)很菜,但丑媳婦總歸是要見家娘,技術(shù)應(yīng)是百花爭(zhēng)嗚,不應(yīng)一家獨(dú)大,否則全世界就只能是那幾個(gè)大拿寫技術(shù)文章了。在這寫寫自己心得,交流交流技術(shù), 引引玉,總歸是件有意義的事。
from:?http://zhukewen-java.iteye.com/blog/1174017
總結(jié)
以上是生活随笔為你收集整理的Log4j的isdebugEnabled的作用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java异常的栈轨迹(Stack Tra
- 下一篇: isInfoEnabled究竟多有用?