私は、多数のデバッグレベルロギングステートメントを持つライブラリに基本クラスを持っています。このライブラリはさまざまなアプリケーションで使用され、基本クラスはサブクラス化されています。私はそれを使用している特定の派生クラスに応じて基本クラスのログレベルを設定できるようにしたい。それを達成するための有用なイディオムは何ですか?例えばLog4Jの派生クラスに基づいて、基本クラスのログを設定するにはどうすればよいですか?
、次は出発点である:
DerivedA
のためではなく、
DerivedB
のロギングをオンにする方法はありません上記の
class Base {
static Logger logger = Logger.getLogger(Base.class);
protected final void foo() {
logger.debug("foo");
}
}
class DerivedA extends Base {
public void boo() {
foo();
}
}
class DerivedB extends Base {
public void boo() {
foo();
}
}
。
代わりに、私は次のような何かをする必要があります:
abstract class Base {
abstract protected Class getDerivedType();
protected final void foo() {
Logger logger = Logger.getLogger(getDerivedType());
logger.debug("foo");
}
}
class DerivedA extends Base {
public void boo() {
foo();
}
@Override protected Class getDerivedType() {
return DerivedA.class;
}
}
class DerivedB extends Base {
public void boo() {
foo();
}
@Override protected Class getDerivedType() {
return DerivedB.class;
}
}
…上記が仕事私は私のlogger
オブジェクトは静的なことができないという事実が好きではないんが
log4j.logger.a.DerivedA=debug
log4j.logger.a.DerivedB=info
:上記の、私は、派生クラスに応じて私のlog4j.properties
ファイル異なるログレベルで持つことができますこれ以上はなく、各メソッドの内部で再定義する必要があります。また、派生クラスが抽象メソッドを定義して、ログをカスタマイズできる以外の理由で具体的な型を指定しなければならないというのは不自然です。
上記は慣用的ですか、そうでない場合は、同じ効果を達成するためのより良い方法はありますか?
一般に、コンテキストに基づいてロギングを設定する方法はありますか? (この場合コンテキストは派生クラスですが、呼び出しスタック、つまりロギングが発生する特定のメソッドを呼び出すメソッドでもあります)。あるいは、このレベルのロギング設定が本当にサポートされていないか、あるいは悪い考えですか?非静的ロガーと