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