We are using a fairly simple log4j2.xml configuration file to log to stdout. However there are cases where we want to change this configuration programmatically after the start of the application to use a log file that is handed over on the command line.
For this I followed the suggestion on the log4j2 homepage and wrote the following method
static void divertLogging(String logFile, Level level) {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
AppenderComponentBuilder appenderBuilder
= builder.newAppender("File", "FILE").addAttribute("fileName", logFile).addAttribute("append", "false");
appenderBuilder.add(builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
builder.add(appenderBuilder);
builder.add(builder.newRootLogger(level).add(builder.newAppenderRef("File")));
try {
builder.writeXmlConfiguration(System.out);
} catch (IOException e) {
throw new ApplicationException(e);
}
BuiltConfiguration configuration = builder.build();
Configurator.initialize(configuration);
((LoggerContext)LogManager.getContext(false)).updateLoggers(configuration);
}
We get the following output
<?xml version="1.0" ?>
<Configuration>
<Appenders>
<FILE name="File" fileName="test.log" append="false">
<PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable"/>
</FILE>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
and then the log message
ERROR Attempted to append to non-started appender File
After that logging continues to be output to stdout and the desired log file stays empty.
Anyone having an idea what I am doing wrong?