2017-07-05 6 views
0

IはLOG4Jたアペンダ(appendersB、appendersC)等の特定のクラスを受けた親は以下のように2つの実装とのインタフェースである動的パラメータに応じのlog4jアペンダを選択

class A { A{Parent a}} 

以下

class B implements Parent {..} 
class C implements Parent {..} 

今、log4jに、クラスAがパラメータBでインスタンス化されるときにappendersBを使用する必要があり、Cを受け取った場合にappendersCを使用する必要があることを伝えたいと思います。

これは可能ですか?

答えて

1

アペンダーの選択は、ロガー名に基づいて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 

あなたは今appenderCappenderBにロガーorg.example.A.B、およびロガーorg.example.A.Cを指示するためのLog4jを設定することができます。

もちろん、任意の方法で動的ロガー名を作成できます。ロガー名はクラス名に基づいている必要はありません。あなたはそれらをbravo.foocharlie.fooと名付けることができます。

+0

これは完璧に動作します、ありがとうございます! – johnII

関連する問題