1. ホーム
  2. java

[解決済み] LoggerFactory.getLogger(ClassName.class) vs LoggerFactory.getLogger(this.getClass().getName())

2022-03-13 08:14:22

質問

私はJavaで最適化のスキルを向上させようとしています。そのために、私が作った古いプログラムがあり、それをより良くするために最善を尽くしています。このプログラムでは、ロギングにSL4Jを使っています。ロガーを取得するために、私はこうしました。

private static final Logger logger = LoggerFactory.getLogger(this.getClass().getName());

このコードを書いた時点では、クラス名への参照を削除するため、これが最良の選択肢だと思いました(これはリファクタリングされる可能性があります)。しかし、今はもう自信がありません...。

private static final Logger logger = LoggerFactory.getLogger(ClassName.class);

一方、クラス名への参照は維持されますが、メソッド呼び出しが1つ削除されます。これは、1つのクラスに対しては大きなパフォーマンス向上にはならないかもしれませんが、たくさんのクラスがある場合には、何か意味があるかもしれません。

そこで質問です。

どちらのアプローチが良いのでしょうか?クラス名を使うか、リフレクションで取得するか?

賛否両論で答えの動機付けをお願いします。ありがとうございました。

どのように解決するのですか?

ここで私の意見を述べさせていただきます。パフォーマンスの観点からは気にしなくていいケースだと思います。おそらくコードの中には、この件よりもずっと最適化できる部分があるはずです :)

さて、ご質問の件です。まず LoggerFactoryの コード

なお getLogger(Class<?> name) はオーバーロードされたメソッドを呼び出すだけです。

Logger logger = getLogger(clazz.getName());

そして、いくつかの追加計算を行います。ですから、Stringを使ったメソッドの方が明らかに若干速いです。

一般的には、Loggerの参照をクラスの静的フィールドとして保持するパターンが多いようです。

public class SomeClass {
   private static final Logger LOG =   LoggerFactory.getLogger(SomeClass.class);
}

この場合、実際に使用できるのは this.getClass() なぜなら this は実際には存在しません (静的なコンテキストで実行されています)。

私の経験では ClassName.getClass() ただし、異なるクラスから同じロガーを使用したい場合は、この限りではありません。そのような場合は、ロガーを示す何らかの論理的な定数を使用した方がよいでしょう。

例えば、3つの異なるクラスを使ってデータベースにアクセスしようとしているとします。 そこで、ロガー 'DB' を作成し、 database.log に書き込むファイルアペンダを割り当て、 3つの異なるクラス間で同じロガーを再利用したいとします。

そこで、以下のようなコードを使用する必要があります。

public class SomeClass {
   private static final Logger LOG =   LoggerFactory.getLogger("DB");
}

これが役に立つといいのですが