Protect against NPE caused by recursive calls

Update `SpringBootConfigurationFactory` so that it no longer attempts
to get a `LoggingSystem`.

The recent `LoggingSystem` update means makes use of the
`SpringFactoriesLoader` class to load candidate logging systems.
Unfortunately, the `SpringFactoriesLoader` class creates a `Logger`
which (when using Log4J2) causes `SpringBootConfigurationFactory` to
run. Calling `LoggingSystem.get` from `SpringBootConfigurationFactory`
results in a recursive call to `SpringFactoriesLoader` which hasn't
yet been fully initialized. We then see an NPE caused by a `null`
`cache`.

This update removes the call to `LoggingSystem.get` with the assumption
that it would never return `null` anyway.

Fixes gh-24163
pull/24208/head
Phillip Webb 4 years ago
parent 33499674e7
commit 0ce3e7ec6b

@ -24,8 +24,6 @@ import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.config.Order; import org.apache.logging.log4j.core.config.Order;
import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.springframework.boot.logging.LoggingSystem;
/** /**
* Spring Boot {@link ConfigurationFactory} that customizes Log4J2's default configuration * Spring Boot {@link ConfigurationFactory} that customizes Log4J2's default configuration
* to: * to:
@ -56,12 +54,11 @@ public class SpringBootConfigurationFactory extends ConfigurationFactory {
@Override @Override
public Configuration getConfiguration(LoggerContext loggerContext, ConfigurationSource source) { public Configuration getConfiguration(LoggerContext loggerContext, ConfigurationSource source) {
if (source != null && source != ConfigurationSource.NULL_SOURCE if (source == null || source == ConfigurationSource.NULL_SOURCE) {
&& LoggingSystem.get(loggerContext.getClass().getClassLoader()) != null) {
return new SpringBootConfiguration();
}
return null; return null;
} }
return new SpringBootConfiguration();
}
private static final class SpringBootConfiguration extends DefaultConfiguration { private static final class SpringBootConfiguration extends DefaultConfiguration {

Loading…
Cancel
Save