protected void log4j2ResolveApplicationRoot()

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" );
    }