Log4j2では、以下の両方が同等に効率的で、ログレベルがDEBUGよりも特定の文字列連結を引き起こしませんか?どんな理由/状況でも、他のものより優先されますか?Log4j2は%dまたは%sを使用して{}を使用しています
log.warn(String.format("Number of cars : %d",carCount));
log.warn("Number of cars : {}",carCount);
また、{}はどのタイプのオブジェクトでも機能しますか?
Log4j2では、以下の両方が同等に効率的で、ログレベルがDEBUGよりも特定の文字列連結を引き起こしませんか?どんな理由/状況でも、他のものより優先されますか?Log4j2は%dまたは%sを使用して{}を使用しています
log.warn(String.format("Number of cars : %d",carCount));
log.warn("Number of cars : {}",carCount);
また、{}はどのタイプのオブジェクトでも機能しますか?
{}
の表記法は、文字列形式の%s %d
よりはるかに効率的です。 (benchmarksはこのためにありますが、私は後でいくつかの数字を追加します。)
{}
表記は、任意のオブジェクトまたは%s %d ...
文字列の形式は、パラメータの種類は、形式と一致するか、例外がスローされている必要がプリミティブな値を、受け入れ。だから一般的には{}
が便利です。
文字列書式を使用する場合は、書式設定をきめ細かく制御できます。 1,234,567.123
のように大きな数字を「きれいに印刷」するか、小数点以下の桁数を制御する場合は、{}
では不十分です。
Log4j2を使用すると、両方の用途を混在させることができます。 String形式の構文をどこでも(LogManager.getFormattedLogger
を使用して)使用することは可能ですが、ほとんどの場合、デフォルトの{}
形式を使用し、printf
メソッドを使用してきめ細かいコントロールが必要な場合にのみString形式構文を使用すると便利です:Log4j2は、文字列やその他の一時的なオブジェクトを作成しないようにする努力をし{}
形式で内部的には
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
、。これは、String形式の構文では不可能です。
そのような精巧な応答のためにRemkoに感謝します。もう少し簡単な質問です。任意のシナリオで{}を使用すると実行時例外がスローされます。 ? – Andy897
これは聞く/言いたいことがないかもしれません。 ..しかし、あなたはどうすればこのことをフォローアップすることができますかをお勧めできます - https://issues.apache.org/jira/browse/LOG4J2-1768。私のフォローアップは、少なくとも問題があるかどうかの確認を意味しています:) – Andy897
デフォルトでは、Log4jは例外を飲み込みます。 'ignoreExceptions =" false "'を設定することによって、例外を呼び出し側に伝搬するように各Appenderを設定することができます。 appender docsを参照してください。 –
今は別の 'String.format'を使って、常に呼び出されるでしょう、それはありませんか?しかし、元の質問についてはまだ興味があります。 – Marvin
タイプに依存しないので、2番目のアプローチを使用することをお勧めします。例えば。最初のアプローチでは、ステリングを小数点パラメタ(例えば、 '%d')に渡す場合、' exception'を得るかもしれません。 @BoristheSpiderがコメントを修正しました。 –
@ Andy897いいえ、「FomatterLogger」は例外的な状況でのみ使用するべきです。ログフォーマットをハードコードし、(Java 8 'Supplier' formutaion(https://logging.apache.org/log4j/2.0/log4j-api/apidocs/org/)で使用されていない限り)高価なメソッドを熱心に呼び出すことがあります。 apache/logging/log4j/Logger.html#debug(org.apache.logging.log4j.Marker、%20java.lang.String、%20org.apache.logging.log4j.util.Supplier ...)))。あなたはシンプルな '{}'形式を守り、メソッド呼び出しの参照を渡すだけで、決してメソッドを呼び出す結果にはなりません。 –