in log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java [662:768]
protected void doConfigure() {
processConditionals(rootNode);
preConfigure(rootNode);
configurationScheduler.start();
// Find the "Properties" node first
boolean hasProperties = false;
for (final Node node : rootNode.getChildren()) {
if ("Properties".equalsIgnoreCase(node.getName())) {
hasProperties = true;
createConfiguration(node, null);
if (node.getObject() != null) {
final StrLookup lookup = node.getObject();
runtimeStrSubstitutor.setVariableResolver(lookup);
configurationStrSubstitutor.setVariableResolver(lookup);
}
break;
}
}
if (!hasProperties) {
final Map<String, String> map = this.getComponent(CONTEXT_PROPERTIES);
final StrLookup lookup = map == null ? null : new PropertiesLookup(map);
final Interpolator interpolator = new Interpolator(lookup, pluginPackages);
interpolator.setConfiguration(this);
interpolator.setLoggerContext(loggerContext.get());
runtimeStrSubstitutor.setVariableResolver(interpolator);
configurationStrSubstitutor.setVariableResolver(interpolator);
}
boolean setLoggers = false;
boolean setRoot = false;
for (final Node child : rootNode.getChildren()) {
if ("Properties".equalsIgnoreCase(child.getName())) {
// We already used this node
continue;
}
createConfiguration(child, null);
if (child.getObject() == null) {
continue;
}
if ("Scripts".equalsIgnoreCase(child.getName())) {
for (final AbstractScript script : child.getObject(AbstractScript[].class)) {
if (script instanceof ScriptRef) {
LOGGER.error(
"Script reference to {} not added. Scripts definition cannot contain script references",
script.getName());
} else if (scriptManager != null) {
scriptManager.addScript(script);
}
}
} else if ("Appenders".equalsIgnoreCase(child.getName())) {
appenders = child.getObject();
} else if (child.isInstanceOf(Filter.class)) {
addFilter(child.getObject(Filter.class));
} else if (child.isInstanceOf(Loggers.class)) {
final Loggers l = child.getObject();
loggerConfigs = l.getMap();
setLoggers = true;
if (l.getRoot() != null) {
root = l.getRoot();
setRoot = true;
}
} else if (child.isInstanceOf(CustomLevels.class)) {
customLevels = child.getObject(CustomLevels.class).getCustomLevels();
} else if (child.isInstanceOf(CustomLevelConfig.class)) {
final List<CustomLevelConfig> copy = new ArrayList<>(customLevels);
copy.add(child.getObject(CustomLevelConfig.class));
customLevels = copy;
} else if (child.isInstanceOf(AsyncWaitStrategyFactoryConfig.class)) {
final AsyncWaitStrategyFactoryConfig awsfc = child.getObject(AsyncWaitStrategyFactoryConfig.class);
asyncWaitStrategyFactory = awsfc.createWaitStrategyFactory();
} else {
final List<String> expected = Arrays.asList(
"\"Appenders\"", "\"Loggers\"", "\"Properties\"", "\"Scripts\"", "\"CustomLevels\"");
LOGGER.error(
"Unknown object \"{}\" of type {} is ignored: try nesting it inside one of: {}.",
child.getName(),
child.getObject().getClass().getName(),
expected);
}
}
if (!setLoggers) {
LOGGER.warn("No Loggers were configured, using default. Is the Loggers element missing?");
setToDefault();
return;
} else if (!setRoot) {
LOGGER.warn(
"No Root logger was configured, creating default ERROR-level Root logger with Console appender");
setToDefault();
// return; // LOG4J2-219: creating default root=ok, but don't exclude configured Loggers
}
for (final Map.Entry<String, LoggerConfig> entry : loggerConfigs.entrySet()) {
final LoggerConfig loggerConfig = entry.getValue();
for (final AppenderRef ref : loggerConfig.getAppenderRefs()) {
final Appender app = appenders.get(ref.getRef());
if (app != null) {
loggerConfig.addAppender(app, ref.getLevel(), ref.getFilter());
} else {
LOGGER.error(
"Unable to locate appender \"{}\" for logger config \"{}\"", ref.getRef(), loggerConfig);
}
}
}
setParents();
}