web-dev-qa-db-ja.com

実行時に構成されたLog4Jアペンダーにアクセスするにはどうすればよいですか?

起動時にアペンダーを構成し、オンデマンドでさまざまなロガーに対して動的に追加および削除したい。 log4jでこのアペンダー自体を構成し、必要なときにそれへの参照を取得することを希望します。それが不可能な場合は、アペンダーを自分でインスタンス化して保持する必要があります。

40
Seth Weiner

通常、アペンダーはルートロガーに追加されます。ここにいくつかの擬似コードがあります

// get the root logger and remove the appender we want
Logger logger = Logger.getRootLogger();
Appender appender = logger.getAppender("foo");
logger.removeAppender(appender)

// when we want to add it back...
logger.addAppender(appender);

ルートロガー以外のロガーでもこれを実行できると確信していますが、試したことはありません。

25
Alan Krueger

Logger クラスには、 getAllAppenders()getAppender()addAppender() 、および removeAppender() メソッド、 Category から継承クラス。ただし、Categoryクラスは非推奨であり、その上、これをこれまでに行ったことは一度もありませんが、これは有用な出発点になる可能性があります。

4
Thomas Owens

私はまったく同じことをやりたいです。 log4j.propertiesでアペンダーを構成し、いくつかを選択して、実行時にrootLoggerに動的に追加します。

アペンダーにアタッチされたロガー以外でアペンダーにアクセスする方法がわからなかったため、最終的にダミーロガーを作成し、アペンダーをアタッチしてアタッチメントをアタッチして動的に取得できるようにしました。 。ただし、アペンダーが使用するリソース(ファイルなど)は使用されていなくても事前に作成されるため、これは理想的ではありません。

3
Joel

実行時にアペンダーを有効/無効にする場合は、別の解決策を見つけました(非常にエレガントではありません)。 log4j構成を使用して、通常どおり必要なすべてのアペンダーを追加します。

実行時にアペンダーを「無効」にする場合は、ログメッセージごとにFilter.DENYを返す(org.Apache.log4j.spi)フィルターを追加します。このようにして、このAppenderに対してメッセージは送信されません。アペンダーを「有効」に戻すには、上記で追加したフィルターをクリアします。

これをテストしましたが、うまく機能します(log4j 1.2)。

0
nLogN

私はこのようにします:

  1. log4j.propertiesでアペンダーを指定しましたが、ルートロガーには追加しませんでした。
  2. 実行時に、必要に応じてlog4j.propertiesを取得し、そこから必要なプロパティを抽出し、アペンダーをインスタンス化し、抽出されたプロパティを読み取ってオプションを設定します。
  3. アペンダーをアクティブにします
  4. Logger.getRootLogger()。addAppender(appender);
  5. 使い終わったらキックオフ-Logger.getRootLogger()。removeAppender(..)

さて、これがあなた自身のアペンダーであれば、プロパティの意味を知っており、何を期待するかを知っているので、(2)を行うのは簡単です。そうでない場合は、リフレクションを使用してクラスをインスタンス化し、その前にプロパティセッターを呼び出してください(3)。

0
Dima