web-dev-qa-db-ja.com

Log4jの暗黙の文字列フォーマット

プロジェクトへのログインにlog4j v1.2.14を使用しています。また、変数を出力に配置するためにJava 7String.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ロギングフレームワークはありますか?

23
Rossiar

slf4j のAPIは、「 パラメータ化されたロギング 」を提供します。これにより、構文が少し異なりますが、正確にそれを行うことができます。例があります:

logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);

実装には、slf4jをネイティブに実装するLogbackを使用するか、slf4jバインディングを使用してlog4jまたは他のロガーに接続できます。 ユーザーマニュアル は、簡単な例とともにそれを説明しています。

33
Yosef Weiner

String.format+、またはロギングシステムで提供されているもの以外の文字列フォーマッタ(log4jなど)を使用することは、悪い習慣と見なされます。通常、コードには、プロダクションで表示したくない低レベルのログ(デバッグ、情報)がたくさんあります。たとえば、String.formatを使用してログに記録する文字列をフォーマットすると、最後に何も記録されない場合でも(たとえば、log4j最小レベルが設定されている場合でも)、非常に長く、リソースを消費する可能性がある新しい文字列を生成してフォーマットします警告またはエラー)。ロガーフォーマッターシステム(log4jのようなもの)を使用すると、ログに記録する必要がない場合に、ロガーがフォーマットされた文字列の生成を回避できるようになります。

これはいくつかのケースで大きな違いを生むかもしれません。

5
Mathieu

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

1
bobanahalf

ところで、このシナリオでは、_+_を使用して変数を文字列に追加することと_String.format_を使用することの間に大きな違いはありません。 。

slf4jを使用すると、

log.info("Your var is {} and you are {}", myVar, myVar1);

印刷フォーマッターの代わりに_{}_を使用していることに注意してください。また、これにはJava> = 1.5が必要です

0
ring bearer