残念なことに、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のシャットダウン時にのみ停止します。