К сожалению, Log4j не предоставляет способ регистрации обратного вызова при загрузке конфигурации.Он просто создает «сторожевой» поток, чтобы отслеживать файл и перезагружать конфигурацию при изменениях файла.
Единственный способ, которым я это вижу, - создать собственный поток, который перезагружает конфигурацию и добавляет дополнительные добавщики.
Вместо:
DOMConfigurator.configureAndWatch(log4jConfigFile.getAbsolutePath(), 100000L);
вы делаете это:
String configFilename = log4jConfigFile.getAbsolutePath();
DOMConfigurator.configure(configFilename);
// set your appenders programmatically here
// ...
MyXMLWatchdog watchDogThread = new MyXMLWatchdog(configFilename);
watchDogThread.setDelay(100000L);
watchDogThread.start();
Вы настроили Log4j, добавили дополнения и запустили поток мониторинга.В потоке вы перезагружаете конфигурацию при изменении файла:
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
// ...
}
}
Посмотрите исходный код этих классов для получения дополнительной информации: DOMConfigurator (прокрутите вниз) и FileWatchdog .
Хотя я предлагаю просто настроить все в файле log4j.xml
и не прибегать к обходным путям.
PS Вы не упоминаете, какой тип Java-приложения у вас есть, нопомните, что configureAndWatch
поставляется с предупреждением в приложениях Java EE , поскольку поток не останавливается при завершении работы приложения;останавливается только при отключении JVM.