2012-01-09 5 views
2

Javaコードにリロードmehodコールバックを必要とする: DOMConfigurator.configureAndWatch(log4jConfigFile.getAbsolutePath()、100000L)を、はのlog4j.xml

configureAndWatchメソッドで作成されたスレッドがlog4j.xmlを再読み込みするたびにappendersをいくつか追加する必要があります。

実際に私はプログラム的にいくつかのアペンダを設定していますが、そのスレッドは、私は再びアペンダを追加する必要がありそうのlog4j.xmlを再読み込みしたときにリセット取得programmatically.Forこれまでスレッドがのlog4j.xmlを再ロードするとき、これは私がコールバックを必要とする

何か案が ??どうすればいいですか?

答えて

0

残念なことに、Log4jは設定ロード時にコールバックを登録する方法を提供しません。ファイルを監視し、ファイル変更の設定をリロードするための「ウォッチドッグ」スレッドを作成するだけです。

私はそれが完了するのを見る唯一の方法は、構成をリロードし、余分なアペンダーを追加する独自のスレッドを生成することです。

の代わりに:あなたは、Log4jのを構成されたアペンダを追加し、監視スレッドを開始し

String configFilename = log4jConfigFile.getAbsolutePath(); 
DOMConfigurator.configure(configFilename); 

// set your appenders programmatically here 
// ... 

MyXMLWatchdog watchDogThread = new MyXMLWatchdog(configFilename); 
watchDogThread.setDelay(100000L); 
watchDogThread.start(); 

DOMConfigurator.configureAndWatch(log4jConfigFile.getAbsolutePath(), 100000L); 

あなたはこれを行います。あなたは、ファイルの変更にコンフィギュレーションをリロードスレッドで:DOMConfigurator(一番下までスクロール)とFileWatchdog

import org.apache.log4j.LogManager; 
import org.apache.log4j.helpers.FileWatchdog; 
import org.apache.log4j.xml.DOMConfigurator; 

public class MyXMLWatchdog extends FileWatchdog { 
    public MyXMLWatchdog(String filename) { 
     super(filename); 
    } 

    public void doOnChange() { 
     new DOMConfigurator().doConfigure(this.filename, LogManager.getLoggerRepository()); 
     // set your appenders programmatically here 
     // ... 
    } 
} 

は、詳細については、これらのクラスのソースコードを見てください。

私の提案では、log4j.xmlファイルですべての設定を行い、回避策に頼らざるを得ません。

P.S.あなたが持っているJavaアプリケーションのタイプは言及していませんが、アプリケーションシャットダウン時にスレッドとしてのconfigureAndWatch comes with a warning in Java EE applicationsが停止しないことに注意してください。 JVMのシャットダウン時にのみ停止します。

関連する問題