アペンダーの選択は、ロガー名に基づいてLog4j構成ファイルで行われるため、ロギング項目が異なるアペンダーに移動するように構成するには、コードごとに異なるロガーを使用する必要があります。
通常、ロガー名は完全修飾クラス名で、ロガーはクラスのstatic
フィールドとして作成されます。これは、パフォーマンス、低メモリフットプリント、および命名の便利さのために行われます。
ただし、ロガーフィールドをstatic
にすることはできません。それを動的に生成された名前で割り当てることができます。一例として、
、あなたA
クラスは、通常はこれを行うだろう:
package org.example;
public class A {
private static final Logger log = LogManager.getLogger(A.class);
// rest of code
}
これは、選択した任意のいずれかのアペンダ(複数可)を書き込むように構成することができますorg.example.A
という名前のロガーを作成します。ベースロガーに
、ひいては潜在的にアペンダ、コンストラクタのパラメータとして指定されたオブジェクトの実際のクラスに、あなたがこれを行うことができます:
package org.example;
public class A {
private final Logger log; // not static
public A(Parent p) {
this.log = LogManager.getLogger(getClass().getName() + "." +
p.getClass().getSimpleName());
}
}
これはA
のインスタンスごとにロガーを作成し、名前はコンストラクタパラメータから派生します。
new A(new B()) // Logger name: org.example.A.B
new A(new C()) // Logger name: org.example.A.C
あなたは今appenderC
にappenderB
にロガーorg.example.A.B
、およびロガーorg.example.A.C
を指示するためのLog4jを設定することができます。
もちろん、任意の方法で動的ロガー名を作成できます。ロガー名はクラス名に基づいている必要はありません。あなたはそれらをbravo.foo
とcharlie.foo
と名付けることができます。
これは完璧に動作します、ありがとうございます! – johnII