有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

每当DOMConfigurator创建线程时,java都需要回调。配置并监视方法重新加载日志4j。xml

Java代码: DOMConfigulator。配置和监视(log4jConfigFile.getAbsolutePath(),100000L)

每当configureAndWatch方法创建的线程重新加载log4j时,我需要添加一些appender programmaticaly。xml

实际上,我以编程方式设置了一些appender,但是当线程重新加载log4j时,它会被重置。所以我需要再次以编程方式添加appender。为此,每当线程重新加载log4j时,我都需要一个回调。xml

有什么想法吗??我该怎么做


共 (1) 个答案

  1. # 1 楼答案

    不幸的是,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应用程序,但要注意^{} comes with a warning in Java EE applications作为线程,应用程序关闭时不会停止;它仅在JVM关闭时停止