20

log4jで書くと

**logger.debug("Processing trade with id: " + id + " symbol: " + symbol);**

文字列プールに文字列を作成しますが、slf4j を使用する場合は、このようなパラメーター ベースを使用します

**logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);**

では、これら 2 つのステートメントの違いは何ですか?slf4j は実行時に String を作成しますか?

4

6 に答える 6

7

String を減らすことでパフォーマンスを向上させると言えconcatenationsます。

これを書くと

"Processing trade with id: " + id + " symbol: " + symbol

印刷文字列を手動で作成しています。

あなたが書くとき

"Processing trade with id: {} and symbol : {} ", id, symbol
                    -------^id------------^symbol---------

2 番目の方法では、出力前に内部的にslf4j維持され、連結を使用して新しい文字列を再度生成します (ソース コードを確認していないため、a である可能性がありますStringBuilder)。

プレースホルダーとして呼び出され、{} 渡された引数に置き換えます。

sl4jのドキュメントから

この形式は、ロガーが DEBUG レベルで無効になっている場合に、余分な文字列の連結を回避します。ただし、このバリアントでは、このロガーが DEBUG に対して無効になっている場合でも、メソッドを呼び出す前に Object[] を作成するための隠れた (そして比較的小さい) コストが発生します。1 つまたは 2 つの引数を取るバリアントは、この隠れたコストを回避するためだけに存在します。

フォーマットの使用方法をお読みください: Scala で java.String.format を使用するには?

于 2013-10-09T11:30:39.403 に答える
2

Log4j2 API を使用すると、logger.info("String: {} int : {}.", "Hello, World ", 10); を使用できます。

于 2016-03-28T06:34:09.650 に答える
1

では、これら 2 つのステートメントの違いは何ですか?slf4j はラム時に String を作成するかどうか?

log4j を使用するか sl4j を使用するかに関係なく、とにかく文字列が作成されます。sl4j は便利なプレースホルダーを提供しています。

于 2013-10-09T11:32:30.873 に答える
0

文字列連結についてです。最初の行は常に文字列の連結を高価な操作にし、2 行目はログ レベルがデバッグと一致しない場合は連結しません。内部の StringBuilder の使用により、ログ レベルの 2 番目のオプションを一致させるとパフォーマンスが向上する可能性があると推測するだけではありません。

于 2013-10-09T11:32:36.770 に答える