Java 代码: DOMConfigurator.configureAndWatch(log4jConfigFile.getAbsolutePath(),100000L);
每当由 configureAndWatch 方法创建的线程重新加载 log4j.xml 时,我需要以编程方式添加一些附加程序。
实际上我正在以编程方式设置一些附加程序,但是当线程重新加载 log4j.xml 时它会被重置,所以我需要再次以编程方式添加附加程序。为此,我需要在线程重新加载 log4j.xml 时进行回调
有什么想法吗??我该怎么做....
最佳答案
不幸的是,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,添加了 appender 并启动了监控线程。在文件更改时重新加载配置的线程中:
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
文件中配置所有内容,而不是求助于解决方法。
附言你没有提到你有什么类型的 Java 应用程序,但要注意 configureAndWatch
comes with a warning in Java EE applications因为线程不会在应用程序关闭时停止;它仅在 JVM 关闭时停止。
关于java - 每当由 DOMConfigurator.configureAndWatch 方法创建的线程重新加载 log4j.xml 时都需要回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8785038/