プロジェクトには、ログへの書き込み時に異なるスタイルを持つ 3 人の開発者がいます。これらのバリエーションのどれが最適ですか?
LOG.info("error = {}", errmsg);
LOG.info("error = ", errmsg);
LOG.info("error = " + errmsg);
LOG.info("error = {}", errmsg);
正しくて最高。
LOG.info("error = ", errmsg);
これはおそらく間違っています。例外でない限りerrmsg、ログに記録されることはありません。
LOG.info("error = " + errmsg);
これは最初ほどパフォーマンスが良くありません。Stringこの行にヒットするたびに連結を実行しますが、最初のケースでは、ステートメントが実際にログに記録される場合にのみ変数の置換が行われます。
これは最高です( SLF4Jの上にjcabi-log):
Logger.info(this, "error=%s", errmsg);
これは、次の短い代替手段です。
private static Logger LOG = Logger.getLogger(Foo.class);
LOG.info(String.format("error=%s", errmsg));
まず、1つのユーティリティクラスにロガーのインスタンス化を処理させると便利です。String.format()次に、文字列全体が常に表示され、簡単に翻訳できるため、テキストの書式設定に使用すると非常に便利です。
第一形態の改造が一番
log.info("error={}", errmsg);
errmsg他の人が言ったように、2 番目の例は、 に挿入するフォーマット トークンが"error = "ないため、間違いである必要がerrmsgありThrowableますinfo。次に、ロガーは stracktrace を出力します。
何年もの間、私は 3 番目の形式である文字列連結を好んでいました。数か月または数年後にコードを読み直すと、読みやすくなることがわかりました。
ただし、Tomasz Nurkiewiczが答えたように、最初の形式LOG.info("error={}", errmsg);が最適です。ただし、その理由は、String.format()文字列連結よりも高速だからではありません。そうではありません。Javaで文字列連結よりもString.formatを使用する方が良い方法ですか?を参照してください。.
最初の形式のパフォーマンスが優れている理由は、infoレベルのログ記録が無効になっている場合、ログ記録フレームワークを呼び出す errmsg.toString() 必要がなく、実行する必要がまったくないからString.format()です。errmsg.toString()パフォーマンス コストがない唯一のケースerrmsgは、String.
また、Splunk のような多くのログ アグリゲーターがフィールドと値のペアに=自動的にインデックスを作成するため、前後に空白を入れないことをお勧めします。error=errmsgまた、これが本当にエラーである場合は、error()ではなくレベルに書き込みinfo()ます。そして、おそらく、Throwableこのコードの前のどこかに例外があり、Throwableパラメーターに入る必要があります。
そして、loggerはおそらく として宣言されていfinalますが、変更可能なオブジェクトであるため、小文字にする必要があります。「静的最終ロガー」は大文字で宣言する必要がありますか?を参照してください。.
つまり、答えは本当に
log.info("error={}", errMsg, exception);