java - 每当由 DOMConfigurator.configureAndWatch 方法创建的线程重新加载 log4j.xml 时都需要回调

标签 java logging log4j

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/

相关文章:

java - 如何将 List 值放入 thenReturn 中进行单元测试?

python - 获取作为参数传递的内置函数的方法名称并在函数体内调用

logging - Nginx 理解访问日志栏

java - 记录多线程应用程序中的 Activity

java - JSON - 将对象转换为 JSON 数组

java - spring 引导 Controller 未注册;得到 404

java - log4j 不记录文件

java - 将 JCS 日志级别设置为错误 - log4j

log4j - 在 Wildly 8.1 中添加 SMTP 日志处理程序

java - Java Socket 是否缓存 DNS?