in proposals/gk/log4j2/src/java/org/apache/turbine/Turbine.java [985:1043]
protected void log4j2ResolveApplicationRoot( LoggerContext context )
{
org.apache.logging.log4j.core.config.Configuration log4jconfig = context.getConfiguration();
Map<String, Appender> appenders = log4jconfig.getAppenders();
List<String> resolvedAppenderNames = appenders.values().stream().
filter( a -> a instanceof FileAppender).
filter( a -> ( (FileAppender) a ).getFileName().contains( TurbineConstants.APPLICATION_ROOT_KEY ) ).
map( a -> ((FileAppender) a ).getName() ).collect( Collectors.toList() );
if (resolvedAppenderNames.isEmpty()) {
return;
}
resolvedAppenderNames.stream().forEach( resolvableAppender -> {
//delete old appender/logger
FileAppender logFile = (FileAppender) log4jconfig.getAppender(resolvableAppender);
Layout<? extends Serializable> old_layout = logFile.getLayout();
String fileNameTemplate = logFile.getFileName();
String resolvedFileName = getApplicationRootSubstitutor().replace(fileNameTemplate);
logFile.stop(); // now no logging until restart!
//create new appender/logger
FileAppender newAppender = FileAppender.newBuilder()
.withAdvertise(false)
.withAdvertiseUri("")
.withAppend(false)
.withBufferedIo(true)
.withBufferSize(8192)
.setConfiguration(log4jconfig)
.withFileName(resolvedFileName)
.withFilter(null)
.withIgnoreExceptions(true)
.withImmediateFlush(true)
.withLayout(old_layout)
.withLocking(false)
.withName(resolvableAppender)
.build();
Map<String,LoggerConfig> loggers =log4jconfig.getLoggers();
// remove old/add new appender
loggers.values().stream().forEach( lc ->
{
lc.getAppenderRefs().forEach( ar -> {
if (ar.getRef().equals( resolvableAppender )) {
lc.removeAppender( resolvableAppender );
lc.addAppender( newAppender,lc.getLevel(), logFile.getFilter() );
}
});
lc.getAppenders().keySet().stream().forEach( appName -> {
if (appName.equals( resolvableAppender )) {
lc.removeAppender( resolvableAppender );
lc.addAppender( newAppender,lc.getLevel(), logFile.getFilter() );
}
});
}
);
newAppender.start();
});
context.updateLoggers();
log.debug( "loggers restarted with applicationRoot is resolved" );
}