Add debug logging to ConfigFileApplicationListener

Update ConfigFileApplicationListener to include more debug level output.
Debug messages are recorded during onApplicationEnvironmentPreparedEvent
but not actually output until onApplicationPreparedEvent. This is
because the logging level might not have been correctly set until the
context is completely prepared.

Fixes gh-1584
pull/2035/head
Phillip Webb 10 years ago
parent 142216400a
commit 23ff7c91d6

@ -27,6 +27,8 @@ import java.util.List;
import java.util.Queue;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@ -106,6 +108,8 @@ public class ConfigFileApplicationListener implements
public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 10;
private static Log logger = LogFactory.getLog(ConfigFileApplicationListener.class);
private String searchLocations;
private String names;
@ -114,6 +118,8 @@ public class ConfigFileApplicationListener implements
private final ConversionService conversionService = new DefaultConversionService();
private final List<Object> debug = new ArrayList<Object>();
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
@ -140,9 +146,21 @@ public class ConfigFileApplicationListener implements
}
private void onApplicationPreparedEvent(ApplicationPreparedEvent event) {
logDebugMessages();
addPostProcessors(event.getApplicationContext());
}
private void logDebugMessages() {
// Debug logging is deferred because the Logging initialization might not have
// run at the time that config file decisions are taken
if (logger.isDebugEnabled()) {
for (Object message : this.debug) {
logger.debug(message);
}
}
this.debug.clear();
}
/**
* Add config file property sources to the specified environment.
* @param environment the environment to add source to
@ -270,6 +288,8 @@ public class ConfigFileApplicationListener implements
private boolean activatedProfiles;
private final List<Object> debug = ConfigFileApplicationListener.this.debug;
public Loader(ConfigurableEnvironment environment, ResourceLoader resourceLoader) {
this.environment = environment;
this.resourceLoader = resourceLoader == null ? new DefaultResourceLoader()
@ -280,7 +300,6 @@ public class ConfigFileApplicationListener implements
this.propertiesLoader = new PropertySourcesLoader();
this.profiles = Collections.asLifoQueue(new LinkedList<String>());
this.activatedProfiles = false;
if (this.environment.containsProperty(ACTIVE_PROFILES_PROPERTY)) {
// Any pre-existing active profiles set via property sources (e.g. System
// properties) take precedence over those added in config files.
@ -354,31 +373,48 @@ public class ConfigFileApplicationListener implements
private PropertySource<?> loadIntoGroup(String identifier, String location,
String profile) throws IOException {
Resource resource = this.resourceLoader.getResource(location);
PropertySource<?> propertySource = null;
if (resource != null) {
String name = "applicationConfig: [" + location + "]";
String group = "applicationConfig: [" + identifier + "]";
PropertySource<?> propertySource = this.propertiesLoader.load(resource,
group, name, profile);
propertySource = this.propertiesLoader.load(resource, group, name,
profile);
if (propertySource != null) {
maybeActivateProfiles(propertySource
.getProperty(ACTIVE_PROFILES_PROPERTY));
addIncludeProfiles(propertySource
.getProperty(INCLUDE_PROFILES_PROPERTY));
}
return propertySource;
}
return null;
StringBuilder msg = new StringBuilder();
msg.append(propertySource == null ? "Skipped " : "Loaded ");
msg.append("config file ");
msg.append("'" + location + "' ");
msg.append(StringUtils.hasLength(profile) ? "for profile " : "");
msg.append(resource == null || !resource.exists() ? "resource not found" : "");
this.debug.add(msg);
return propertySource;
}
private void maybeActivateProfiles(Object value) {
if (!this.activatedProfiles == true) {
if (this.activatedProfiles) {
if (value != null) {
this.debug.add("Profiles already activated, '" + value
+ "' will not be applied");
}
return;
}
Set<String> profiles = getProfilesForValue(value);
activateProfiles(profiles);
if (profiles.size() > 0) {
this.debug.add("Activated profiles "
+ StringUtils.collectionToCommaDelimitedString(profiles));
this.activatedProfiles = true;
}
}
}
private void addIncludeProfiles(Object value) {
Set<String> profiles = getProfilesForValue(value);

@ -18,6 +18,8 @@ package org.springframework.boot.context.config;
import java.util.Random;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
@ -33,6 +35,8 @@ import org.springframework.util.StringUtils;
*/
public class RandomValuePropertySource extends PropertySource<Random> {
private static Log logger = LogFactory.getLog(RandomValuePropertySource.class);
public RandomValuePropertySource(String name) {
super(name, new Random());
}
@ -42,6 +46,9 @@ public class RandomValuePropertySource extends PropertySource<Random> {
if (!name.startsWith("random.")) {
return null;
}
if (logger.isTraceEnabled()) {
logger.trace("Generating random property for '" + name + "'");
}
if (name.endsWith("int")) {
return getSource().nextInt();
}
@ -71,6 +78,7 @@ public class RandomValuePropertySource extends PropertySource<Random> {
environment.getPropertySources().addAfter(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
new RandomValuePropertySource("random"));
logger.trace("RandomValuePropertySource add to Environment");
}
}

Loading…
Cancel
Save