protected void addOrUpdateAppender()

in src/main/java/org/apache/sling/commons/log/logback/internal/LogConfigManager.java [1123:1214]


    protected void addOrUpdateAppender(
            @NotNull AppenderOrigin origin, @NotNull String appenderName, @NotNull Dictionary<String, ?> config) {
        // detach any values from a previous call so we don't get duplicates
        Map<String, Set<String>> appenderNameToLoggerNamesMap =
                appendersByOrigin.getOrDefault(origin, Collections.emptyMap());
        Set<String> loggerNamesSet =
                new HashSet<>(appenderNameToLoggerNamesMap.getOrDefault(appenderName, Collections.emptySet()));
        for (String loggerName : loggerNamesSet) {
            Logger targetLogger = (Logger) LoggerFactory.getLogger(loggerName);
            maybeDetachAppender(origin, appenderName, targetLogger);
        }

        String pattern = converter
                .convert(config.get(LogConstants.LOG_PATTERN))
                .defaultValue(LogConstants.LOG_PATTERN_DEFAULT)
                .to(String.class);
        PatternLayoutEncoder ple = new PatternLayoutEncoder();
        ple.setPattern(pattern);
        ple.setContext(loggerContext);
        ple.start();

        String file = converter
                .convert(config.get(LogConstants.LOG_FILE))
                .defaultValue("")
                .to(String.class);
        OutputStreamAppender<ILoggingEvent> appender;
        if (file.isEmpty() || LogConstants.FILE_NAME_CONSOLE.equals(file)) {
            appender = new ConsoleAppender<>();
        } else {
            // resolve the path relative to the sling home folder
            file = getAbsoluteFilePath(file);
            RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<>();
            fileAppender.setFile(file);
            fileAppender.setAppend(true);

            String fileNamePattern = LogWriter.createFileNamePattern(
                    file,
                    converter
                            .convert(config.get(LogConstants.LOG_FILE_SIZE))
                            .defaultValue(LogConstants.LOG_FILE_SIZE_DEFAULT)
                            .to(String.class));

            // resolve the path relative to the sling home folder
            fileNamePattern = getAbsoluteFilePath(fileNamePattern);

            TimeBasedRollingPolicy<Object> rollingPolicy = new TimeBasedRollingPolicy<>();
            rollingPolicy.setContext(loggerContext);
            rollingPolicy.setParent(fileAppender);
            rollingPolicy.setFileNamePattern(fileNamePattern);
            int fileNumber = converter
                    .convert(config.get(LogConstants.LOG_FILE_NUMBER))
                    .defaultValue(5)
                    .to(Integer.TYPE);
            rollingPolicy.setMaxHistory(fileNumber);
            rollingPolicy.start();

            fileAppender.setRollingPolicy(rollingPolicy);

            appender = fileAppender;
        }
        appender.setName(appenderName);
        appender.setEncoder(ple);
        appender.setContext(loggerContext);
        appender.start();

        Level level = Level.valueOf(converter
                .convert(config.get(LogConstants.LOG_LEVEL))
                .defaultValue(LogConstants.LOG_LEVEL_DEFAULT)
                .to(String.class));
        boolean additive = converter
                .convert(config.get(LogConstants.LOG_ADDITIV))
                // If an appender is explicitly defined then set additive to false
                // to be compatible with earlier Sling Logging behavior
                .defaultValue(false)
                .to(Boolean.TYPE);
        String[] loggers = converter
                .convert(config.get(LogConstants.LOG_LOGGERS))
                .defaultValue(org.slf4j.Logger.ROOT_LOGGER_NAME)
                .to(String[].class);
        for (String loggerName : loggers) {
            Logger targetLogger = (Logger) LoggerFactory.getLogger(loggerName);

            addInfo(String.format("attaching appender %s for %s", appenderName, targetLogger.getName()));

            targetLogger.setLevel(level);
            targetLogger.setAdditive(additive); /* set to true if root should log too */
            targetLogger.addAppender(appender);
        }

        // remember what loggers we attached the appender to
        addedAppenderRef(origin, appenderName, List.of(loggers));
    }