6

私はJavaから始めて、何かをログに記録しようとしています。

private static final Logger _logger = Logger.getLogger("my"); 

String car = "bmw";
String dog = "dog"; 

_logger.info(car + " text " + dog); // on this line Netbeans

.. この行で、Netbeans は黄色の電球を表示し、次のように言います:ロガーでの文字列連結の非効率的な使用

そこで、「文字列連結をメッセージ テンプレートに変換する」をクリックすると、コードが次のように変更されます。

_logger.log(Level.INFO, "[{0}] v{1} enabled", new Object[]{car, dog});

それが問題を引き起こします。ログに表示されるため:[{0}] v{1} enabled 修正方法は?

4

4 に答える 4

9

いくつかのオプションがあります

1) String.format() を使用します_logger.log(Level.INFO, String.format("[%s] %s enabled", car, dog))

2)StringBuilder.append()または String.concat()` を使用します。

元:_logger.log(Level.INFO, new StrinBuilder(car).append(" text ").append(dog));

これは本質的に、javac が最適化で行うことです。

3) 効率は関係ないため、警告は無視してください。本当に速度を気にするなら、ログに記録しないでしょう。ロギングには時間がかかりますが、文字列の書式設定と文字列の追加の違いは、ログの書き込みに費やされた時間に比べて非常に小さいです。

于 2012-09-07T18:36:18.197 に答える
1

それはNetbeansからのアドバイスを助けているだけで、実際にはコードです

_logger.info(car + " text " + dog); // on this line Netbeans
_logger.log(Level.INFO, "{0} text {1}", new Object[]{car, dog});

同じ出力を生成します。最初のバリアントはコーダーフレンドリーで、デバッグメッセージを入力する時間が少なくなりました.2番目のバリアントは素晴らしいです.

于 2012-09-07T18:50:25.167 に答える
1

メッセージを書き込む必要があるかどうかを判断する前に、パラメーター化されていない文字列を生成するアプローチ非効率的です。

おそらく、書き方が悪いでしょうjava.util.logging.FormatterLogRecord.getMessage()つまり、組み込むのではなく、単に出力するフォーマッターを意味しますLogRecord.getParameters()

于 2012-09-07T18:56:54.533 に答える
0

これは、netbeans 7.1.2 が行う実際のフォーマットです。

public class Vels4j {

    private static final Logger _logger = Logger.getLogger("my");
    String car = "bmw";
    String dog = "dog";

    Vels4j() {
       // _logger.info(car + " text " + dog);
        _logger.log(Level.INFO, "{0} text {1}", new Object[]{car, dog});
    }

    public static void main(String[] args) {
        Vels4j vels4j = new Vels4j(); 
    }
}

必要ない場合は、ヒントを無効にすることができます。ヒントも設定可能です。

于 2012-09-07T18:52:51.650 に答える