ProgressBarLogger.java

package org.heigit.ors.util;

import org.apache.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.layout.PatternLayout;

public class ProgressBarLogger {

    private static final String LOGGER_NAME = "ProgressBarLogger";
    private static final Logger CLASS_LOGGER = Logger.getLogger(ProgressBarLogger.class);


    private static Logger initializeLogger() {
        LoggerContext context = LoggerContext.getContext(false);
        Configuration config = context.getConfiguration();
        if (Logger.getRootLogger().getAppender(LOGGER_NAME) == null) {
            String originalConsolePattern;
            try {
                originalConsolePattern = config.getAppender("Console").getLayout().getContentFormat().get("format");
            } catch (Exception e) {
                originalConsolePattern = "%d{yyyy-MM-dd HH:mm:ss} %highlight{%-7p} %style{%50t}{Cyan} %style{[ %-40.40c{1.} ]}{Bright Cyan}   %m";
            }

            // Remove new line characters from the end of the pattern
            if (originalConsolePattern.endsWith("%n")) {
                originalConsolePattern = originalConsolePattern.substring(0, originalConsolePattern.length() - 2);
            }

            // Remove new line characters from the beginning of the pattern
            if (originalConsolePattern.startsWith("%n")) {
                originalConsolePattern = originalConsolePattern.substring(2);
            }

            final PatternLayout layout = PatternLayout.newBuilder()
                    .withPattern(originalConsolePattern + "\r")
                    .withConfiguration(config)
                    .build();

            Appender consoleAppender = ConsoleAppender.newBuilder()
                    .setConfiguration(config)
                    .setName(LOGGER_NAME)
                    .setLayout(layout)
                    .setFilter(null)
                    .setTarget(ConsoleAppender.Target.SYSTEM_OUT)
                    .setName(LOGGER_NAME)
                    .setFollow(false)
                    .build();
            consoleAppender.start();

            // Create the new appender reference
            AppenderRef ref = AppenderRef.createAppenderRef(LOGGER_NAME, null, null);
            AppenderRef[] refs = new AppenderRef[]{ref};
            LoggerConfig loggerConfig = LoggerConfig.newBuilder()
                    .withAdditivity(false)
                    .withLevel(CLASS_LOGGER.getLevel().getVersion2Level())
                    .withLoggerName(LOGGER_NAME)
                    .withIncludeLocation("true")
                    .withRefs(refs)
                    .withProperties(null)
                    .withConfig(config)
                    .withtFilter(null)
                    .build();

            config.addAppender(consoleAppender);
            loggerConfig.addAppender(consoleAppender, null, null);
            config.addLogger(LOGGER_NAME, loggerConfig);
            context.updateLoggers();
        }
        return Logger.getLogger(LOGGER_NAME);
    }

    public static String getLoggerName() {
        return LOGGER_NAME;
    }

    public static Logger getLogger() {
        return initializeLogger();
    }
}