各クラスでクラス名を指定する代わりに:
log = Logger.getLogger(Foo.class);
log = Logger.getLogger(Bar.class);
log = Logger.getLogger(Test.class);
使用してもよろしいですか :
log = Logger.getLogger(this.getClass());
どのような影響がありますか?
サブクラスを作成すると、ログ メッセージはサブクラスのロガーに記録されます。
package pkgone;
public class SuperType {
private Logger log = Logger.getLogger(this.getClass());
public void someAction() {
log.info("Doing something");
}
}
.
package pkgtwo;
import pkgone.SuperType;
public class SubType extends SuperType {
// for instances of SubType, the log object in SuperType
// will get initialized with SubType's class object
}
.
// some code somewhere that uses SubType
SubType obj = new SubType();
obj.someAction();
上記の例では、"Doing something" は pkgone.SuperType ロガーではなく、pkgtwo.SubType ロガーに記録されます。これは、必要な場合とそうでない場合があります。
を繰り返したくないlogger
、間違ったクラス名を書きたくない場合は@Log of Project Lombokがあります。
プロジェクトでもう 1 つのライブラリを使用してもかまわない場合は、単純な注釈を付けてロガーを追加するだけです。
import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;
@Log
public class LogExample {
public static void main(String... args) {
log.error("Something's wrong here");
}
}
確かにそれは問題ないようです。
静的コンテキストからログを使用する際に問題が発生する可能性がある場合は、ログが初期化されていないか、表示されていない可能性があることに注意してください。
+1 スーパーメソッドを呼び出すサブクラスインスタンスの場合、ロガーはサブクラスになります。
また、これをクラスのロギング テンプレートとして適用する場合、クラスが抽象の場合、このクラスのインスタンスがないため、 this.getClass は失敗します。
私が知っているような影響はありません。マットのコメントによると、それは誰もが望んでいる正しい行動だと思います。