2017-05-23 5 views
1

私たちのアプリケーションにslf4j + log4j2を使用して評価しようとしています。私はSLF4Jに備えてパラメータ化メッセージに関するこれらのようなドキュメントを読み込む:https://www.slf4j.org/faq.html#logging_performanceslf4jパラメータ化されたメッセージの理解

は、この機能を理解するために、私はこのコードを試してみました:

int a = 10; 
logger.trace("test: " + a++); 
logger.error("value of a: " + a); 
logger.trace("test {}", a++); 
logger.error("value of a " + a); 

ログレベルはERRORに設定されています。それで、最初のトレースログでは、 'a'は古い非効率なログの方法なので、増分されると仮定していました。しかし、パラメータ化されたロギングを使用しているので、2番目のトレースログでトレースレベルが有効になっていないと、 'a ++'も評価されません。しかし、それは評価されているように見えます。私は2つのエラーログで11と12の値を参照してください。

この動作を見ているslf4jパラメータメッセージについて理解してもらえますか?

私はそれでSLF4J 1.6.4とlog4j2.7

答えて

0

ルックをこのように使用しています:a変数は、このコードでインクリメントされますか?

​​

答えははいです。

Log4j2またはslf4j APIには魔法はありません。上記の例では、あなただけのメッセージが実際にあなたがする必要がログインしているときa変数を増加させたい場合は:

if (logger.isTraceEnabled()) { 
    logger.trace("test {}", a++); 
} 

あなたがオブジェクトをログに記録しているときに話が若干異なっています。パラメータ化されたロギング・スタイルを使用すると、ロギング・ライブラリは、最初にメッセージ・ストリングをフォーマットする前にログ・レベルをチェックできます。ログレベルが有効でない場合、パラメータオブジェクトに対してtoString()を呼び出すことを避けることができます。例えば

// always calls toString() on the parameter 
logger.trace("a time: " + LocalTime.now()); 

// only calls toString() if trace is enabled 
logger.trace("a time: {}", LocalTime.now()); 

実は、私は少し嘘をつきました。 slf4j APIには魔法がないかもしれませんが、Log4j2 APIはそうです!

logger.trace("test {}",() -> a++); 

これは、トレース・ロギングが有効になっている場合にのみ評価されたラムダ式は次のとおりです:-)のJava 8のLog4j2のAPIを使用して

、あなたはこのコードを持つことができます。したがって、以前は3行が必要だった行を1行で記述することができます。

これは、slf4j APIではなくconsider programming to the Log4j2 APIの理由の1つです。

+0

Remko ..yaの説明に感謝しています。他の投稿を先に見て、log4j2 apiも評価しています。 – anuragz

関連する問題