in src/main/java/org/apache/sling/commons/log/logback/internal/LogConfigManager.java [503:603]
public void updateLoggerConfiguration(final String pid, final Dictionary<?, ?> configuration, final boolean performRefresh)
throws ConfigurationException {
if (configuration != null) {
String pattern = (String) configuration.get(LogConfigManager.LOG_PATTERN);
final String level = (String) configuration.get(LogConfigManager.LOG_LEVEL);
String fileName = (String) configuration.get(LogConfigManager.LOG_FILE);
final Set<String> categories = toCategoryList(configuration.get(LogConfigManager.LOG_LOGGERS));
final boolean additiv;
if ( configuration.get(LogConfigManager.LOG_ADDITIV) != null ) {
additiv = Boolean.valueOf(configuration.get(LogConfigManager.LOG_ADDITIV).toString());
} else {
// If an appender is explicitly defined then set additive to false
// to be compatible with earlier Sling Logging behavior
additiv = false;
}
// verify categories
if (categories == null) {
throw new ConfigurationException(LogConfigManager.LOG_LOGGERS, "Missing categories in configuration "
+ pid);
}
// verify no other configuration has any of the categories
for (final String cat : categories) {
final LogConfig cfg = configByCategory.get(cat);
if (cfg != null && !pid.equals(cfg.getConfigPid())) {
throw new ConfigurationException(LogConfigManager.LOG_LOGGERS, "Category " + cat
+ " already defined by configuration " + cfg.getConfigPid());
}
}
// verify log level
if (level == null) {
throw new ConfigurationException(LogConfigManager.LOG_LEVEL, "Value required");
}
final Level logLevel;
final boolean resetToDefault;
if (LOG_LEVEL_RESET_TO_DEFAULT.equalsIgnoreCase(level)){
resetToDefault = true;
logLevel = null;
} else {
logLevel = Level.toLevel(level);
resetToDefault = false;
}
// verify pattern
if (pattern == null || pattern.length() == 0) {
pattern = LogConfigManager.LOG_PATTERN_DEFAULT;
}
//Map empty fileName to console logger
//null fileName is for scenario where intention is just to change the log level
if (fileName != null && fileName.trim().length() == 0) {
fileName = LogWriter.FILE_NAME_CONSOLE;
}
// FileName being just null means that we want to change the
// LogLevel
if (fileName != null && !isConsole(fileName)) {
fileName = getAbsoluteFilePath(fileName);
}
// create or modify existing configuration object
final LogConfig newConfig = new LogConfig(this, pattern, categories, logLevel, fileName, additiv,
pid, loggerContext, resetToDefault);
if (isPackagingDataEnabled()) {
newConfig.setPostProcessor(new OSGiAwareExceptionHandling(logbackManager.getPackageInfoCollector()));
}
LogConfig oldConfig = configByPid.get(pid);
if (oldConfig != null) {
configByCategory.keySet().removeAll(oldConfig.getCategories());
}
// relink categories
for (String cat : categories) {
configByCategory.put(cat, newConfig);
}
configByPid.put(pid, newConfig);
} else {
// configuration deleted if null
// remove configuration from pid list
LogConfig config = configByPid.remove(pid);
if (config != null) {
// remove all configured categories
configByCategory.keySet().removeAll(config.getCategories());
}
}
if (performRefresh) {
logbackManager.configChanged();
}
}