2013-07-25 23 views
23

私はいくつかのコードを通過した時、私は次のように、ロガーの使用に気づいlogger.debug()を使用する前にLog4j isDebugEnabled()が必要ですか?

if(logger.isDebugEnabled()) 
    logger.debug("Something.."); 

しかし、いくつかのコードでは、私はこのような観察は。

logger.debug("Something.."); 

私がチェックしたif(logger.isDebugEnabled())ロガー自体のdebug()方法では、log4jののソースを見ました。では、なぜこの不要なオーバーヘッドが必要なのでしょうか。if(logger.isDebugEnabled()) ??

答えて

37

logger.debug(...)に渡す文字列が評価に時間がかかる場合に便利です。この場合、デバッグが有効になっていない場合はこの評価をスキップできます。

if(logger.isDebugEnabled()) { 
    logger.debug("The meaning of life is " + calculateMeaningOfLife()); 
} 

IMOこれはコードの読み込みが非常に少ないため、パフォーマンスが大幅に向上した場合にのみ使用する必要があります。

4

Javaは、デバッグメソッドに渡された文字列パラメータを、呼び出す前にまず解決する必要があります。

logger.debug("Something.. var1=" + variable1 + " var2=" + variable2); 

上記のコードは、+が別のStringを作成するときに複数のStringオブジェクトが作成されるため、メソッドを呼び出す前に約5つ以上のオブジェクトが作成されます。

ほとんどの場合、デバッグは有効になっていないため、デバッグが有効かどうかは、常にパラメータを解決するよりも効率的です。

10

isDebugEnabledは、一般的に不要な文字列連結のを避けるために使用され、例えばこのコール

logger.debug("Line number = " + n); 

は、最初に(そしてデバッグを文字列の連結のを呼び出し)だけにしてロガーは、デバッグが有効になっていないことを検出し、単純に返します。これはアプリのパフォーマンスに大きな影響を与える可能性があります。

この問題は、この

public void debug(String format, Object arg); 
2

の文のようなログメソッドをフォーマットしたSLF4Jで解決されています

if(log.isDebugEnabled()){ 

は単にパフォーマンス上の理由から使用されます。内部的にはlogメソッドによって呼び出されるため、使用はオプションです。

しかし、このチェックが社内で行われているかどうか尋ねるので、なぜそれを使用する必要がありますか?これは非常に簡単です:このような簡単なものをログに記録すれば、

log.debug("ResultSet rs is retrieved from OracleTypes"); 

あなたは何も確認する必要はありません。あなたは、このような追記演算子(+)を使用してログインするには、文字列を構成した場合:この場合

log.debug("[" + System.getTimeInMillis() + "] ResultSet rs is retrieved from OracleTypes"); 

をログが有効かされていない場合、そうでない場合ので、あなたはログがある場合でも、チェックする必要があります作られていない、文字列の構成です。そして、文字列を連結する演算子 "+"の使用は非常に非効率的であることを思い出さなければなりません。

1

SLF4J実装(バージョン1.7でチェック。10)のようないくつかの方法でisDebugEnabled()呼び出します:

public void debug(String format, Object... arguments) { 
    if(this.log.isDebugEnabled()) { 
     FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments); 
     this.log.debug(ft.getMessage(), ft.getThrowable()); 
    } 
} 

をしかし、内部でのように、与えられたlogginレベルが有効になっているかどうかをチェックしません、メソッドのオーバーロードがあります。

public void debug(String msg, Throwable t) { 
    this.log.debug(msg, t); 
} 

もう一つは、そのロガーでは、実装を変更することができるので、ロガーがロギングレベルに応じて常に呼び出されるようにしたい場合は、isDebugEnabled()メソッドを使用することを検討してください。

関連する問題