プロジェクトへのログインにlog4j v1.2.14
を使用しています。また、変数を出力に配置するためにJava 7
String.format() も使用しています。現在書いています
LOGGER.info(String.format("Your var is [%s] and you are [%s]", myVar, myVar1));
これは本当に文字列を出力する最良の方法ですか? log4j
はこれを暗黙的に以下のように実装する必要があると思います:
LOGGER.info("Your var is [%s] and you are [%s]", myVar, myVar1);
私は何かを見逃しましたか?さらに、これをサポートするJavaロギングフレームワークはありますか?
slf4j のAPIは、「 パラメータ化されたロギング 」を提供します。これにより、構文が少し異なりますが、正確にそれを行うことができます。例があります:
logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);
実装には、slf4jをネイティブに実装するLogbackを使用するか、slf4jバインディングを使用してlog4jまたは他のロガーに接続できます。 ユーザーマニュアル は、簡単な例とともにそれを説明しています。
String.format
、+
、またはロギングシステムで提供されているもの以外の文字列フォーマッタ(log4j
など)を使用することは、悪い習慣と見なされます。通常、コードには、プロダクションで表示したくない低レベルのログ(デバッグ、情報)がたくさんあります。たとえば、String.format
を使用してログに記録する文字列をフォーマットすると、最後に何も記録されない場合でも(たとえば、log4j
最小レベルが設定されている場合でも)、非常に長く、リソースを消費する可能性がある新しい文字列を生成してフォーマットします警告またはエラー)。ロガーフォーマッターシステム(log4j
のようなもの)を使用すると、ログに記録する必要がない場合に、ロガーがフォーマットされた文字列の生成を回避できるようになります。
これはいくつかのケースで大きな違いを生むかもしれません。
Log4jは内部フォーマットをサポートしています。どこにも文書化されていることはわかりませんが、その例をここで見ました。
https://logging.Apache.org/log4j/2.x/manual/markers.html
試してみましたが、うまくいきました!私はlog4j 2.11.2を使用しています。
int i = 42;
String str1 = "the answer";
String str2 = "life, the universe, and everything";
console.info("{} is {} to {}", i, str1, str2);
ロガーのjavadocを見ると、Lo4j 2で導入され、最大10個のパラメーターをサポートしていると思います。
https://logging.Apache.org/log4j/2.x/log4j-api/apidocs/org/Apache/logging/log4j/Logger.html
ところで、このシナリオでは、_+
_を使用して変数を文字列に追加することと_String.format
_を使用することの間に大きな違いはありません。 。
slf4jを使用すると、
log.info("Your var is {} and you are {}", myVar, myVar1);
印刷フォーマッターの代わりに_{}
_を使用していることに注意してください。また、これにはJava> = 1.5が必要です