[ https://issues.apache.org/jira/browse/LOG4J2-2068?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16198541#comment-16198541 ]
Robert Haycock commented on LOG4J2-2068: ---------------------------------------- I don't know how you like your tests added so I'll just paste a quick and dirty one here... {code} import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.AbstractLifeCycle; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.status.StatusData; import org.apache.logging.log4j.status.StatusListener; import org.apache.logging.log4j.status.StatusLogger; import org.junit.Test; public class MyTest extends AbstractLifeCycle { @Test public void test_Log4j2Reload() { File config1 = new File("1.xml"); File config2 = new File("2.xml"); try { String firstConf = "<configuration monitorInterval=\"5\">" + " <appenders>" + " <console name=\"console\" target=\"SYSTEM_OUT\">" + " <patternLayout pattern=\"%d %5p - %m%n\" />" + " </console>" + " </appenders>" + " <loggers>" + " <root level=\"warn\">" + " <appenderRef ref=\"console\" />" + " </root>" + " </loggers>" + "</configuration>"; FileWriter out = new FileWriter(config1); out.write(firstConf); out.close(); String secondConf = "<configuration monitorInterval=\"5\">" + " <loggers>" + " <root level=\"warn\" />" + " </loggers>" + "</configuration>"; out = new FileWriter(config2); out.write(secondConf); out.close(); System.getProperties().setProperty("log4j.configurationFile", config1.getAbsolutePath() + "," + config2.getAbsolutePath()); LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); loggerContext.reconfigure(); StatusLogger statusLogger = (StatusLogger) getStatusLogger(); statusLogger.registerListener(new StatusListener() { @Override public void close() throws IOException { } @Override public void log(StatusData data) { if (data.getLevel().equals(Level.ERROR)) errored(); } @Override public Level getStatusLevel() { return Level.ERROR; } }); // Check flag is false before reload assertFalse(error); // Make a change to cause a reload out = new FileWriter(config2); out.append(' '); out.close(); // Wait for the reload to trigger synchronized (this) { wait(10000); } // Check for error assertFalse("An error occurred during reconfigure", error); } catch (IOException | InterruptedException ex) { ex.printStackTrace(); fail(); } finally { try { config1.delete(); } catch (Exception ex) { } try { config2.delete(); } catch (Exception ex) { } } } boolean error; public void errored() { error = true; } } {code} > Can't set monitorInterval for composite XML configuration. > ---------------------------------------------------------- > > Key: LOG4J2-2068 > URL: https://issues.apache.org/jira/browse/LOG4J2-2068 > Project: Log4j 2 > Issue Type: Bug > Components: Core > Affects Versions: 2.9.1 > Reporter: Robert Haycock > > When trying to combine a composite configuration with automatic reload, it > fails to reload. > When an {{XmlConfiguration}} is reloaded it calls > {{XmlConfiguration.reconfigure()}} which sets the {{rootElement}} field, and > everything is fine. > When a {{CompositeConfiguration}} is reloaded, it doesn't call > {{reconfigure()}} on the {{XmlConfigurations}}. This means when it tries to > start the config {{XmlConfiguration.setup()}} is called and {{rootElement}} > is null, resulting in an error message "No logging configuration". > End result is the config isn't loaded and there's no more logging. > To reproduce, it doesn't matter what is in the configurations. Just need at > least 2 XML configs in the {{log4j.configurationFile}} property and the > {{monitorInterval}} set. > (Ps. my first ticket) -- This message was sent by Atlassian JIRA (v6.4.14#64029)