web-dev-qa-db-ja.com

%dまたは%sの使用に対して{}を使用するLog4j2

Log4j2では、次の両方が同等に効率的であり、DEBUGよりも具体的なログレベルで文字列の連結を引き起こしませんか?そして、何らかの理由/状況で、一方が他方よりも優先されますか?

log.warn(String.format("Number of cars : %d",carCount));
log.warn("Number of cars : {}",carCount );

また、{}はどのタイプのオブジェクトでも機能しますか?

9
Andy897

{}表記は、%s %d文字列形式の表記よりもはるかに効率的です。 (これには ベンチマーク があります。後でいくつかの番号を追加します。)

{}表記は、任意のオブジェクトまたはプリミティブ値を受け入れます。%s %d ...文字列形式では、パラメーターのタイプが形式と一致する必要があります。そうでない場合、例外がスローされます。したがって、一般的には{}の方が便利です。

文字列フォーマット構文を使用したい場合があります。これは、フォーマットを非常にきめ細かく制御できるためです。大きな数値を1,234,567.123として「プリティプリント」する場合、または小数点以下の桁数を制御する場合は、{}では不十分です。

Log4j2では、両方の使用法を組み合わせることができます。文字列形式の構文はどこでも使用できますが(LogManager.getFormattedLoggerを使用)、ほとんどの場合、デフォルトの{}形式を使用し、必要な場合にのみ文字列形式の構文を使用する方が便利です。 printfメソッドを使用したきめ細かい制御:

logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());

内部的には、{}形式を使用して、Log4j2は文字列やその他の一時オブジェクトの作成を回避するように努めています。これは、文字列形式の構文では不可能です。

16
Remko Popma