2011-07-06 4 views
0

私は、例えばcom.example.BaseMessagingAgentクラスを持つメッセージ駆動型システムを持っています。これは多くのメッセージエージェントの基本クラスです。この基本クラスはメッセージイベントを記録します。この基本クラスの多くのサブクラスがあり、システムの異なる特定のエージェントを実装しています。 com.example.BaseMessagingAgentを継承するcom.example.MyAgentをそれらの1つとしましょう。log4jのサブクラスをフィルタリングする

MyAgentクラスに関連するメッセージのみを記録します。ロギングが親クラスcom.example.BasicMessagingAgentに発生するため、

log4j.logger.com.example.MyAgent=DEBUG, APPENDER 

- 私は何も記録されません。しかし、私はとロギングを定義することはできません。

そして、私はまた、基本クラスでロギングを設定する必要はありません:

log4j.logger.com.example.BaseMessagingAgent=DEBUG, APPENDER 

それはすべてのエージェントのイベントをログに記録する、と私は不必要なログがたくさんありますので。

ログを1つのサブクラスに制限する方法をenyoneが知っていますか?

+1

コードでLoggerをどのように定義していますか?静的? –

+0

これは三社コードです。私は.classファイルしか持っていません。 – Nulldevice

答えて

0

の詳細は、それは実際、非常に単純です。

まず、ルートロガーにアペンダーを追加します。本当に。あなたの人生はもっと簡単になります。

今全部設定:「com *」

log4j.rootLogger=DEBUG, APPENDER 
log4j.logger.com=ERROR 
log4j.logger.com.example.MyAgent=DEBUG 

以下のすべてのクラスのデフォルトのエラーのみをログに記録することになります。唯一の例外はデバッグレベルでログするcom.example.MyAgentです。

はあなたにもDEBUGにルートロガーを設定する必要があるか、それはすべてのDEBUGログメッセージを捨てます。

次の手順は、インスタンスごとに1つのロガーを使用することです。それを得るには、あなたのロガーを作成する行のstaticを削除して、をgetClass()

と置き換えてください。それは残念ですが、それはlog4jの仕組みです。また、毎秒MyAgentの数百万を作成しない限り、インスタンスごとにロガーを作成することはあまり高価ではありません。

本当に1つのクラスにアペンダーを追加する場合は、追加性(...Class.additivity=false)をオフにすることを忘れないでください。そうしないと、すべてのログメッセージが2回取得されます。

+2

ここで重要なのは、コード内のLogger宣言から静的を削除することですが、@ Nulldeviceはサードパーティのコードで作業していると思います。 –

+0

逆コンパイル。あなたはただ一つの行を修正する必要があります。ばかさえも新しいバージョンに修正を適用するためにビルドできるプロジェクトを作成することを確認してください。それ以外の場合は、ASMなどのツールを使用してバイトコードから「静的」フラグをフィルタリングします。 –

関連する問題