转储Spring引导配置

时间:2015-11-19 18:05:41

标签: spring configuration spring-boot

我们的Ops人员希望在应用启动时将Spring启动配置(即所有属性)转储到日志文件中。我假设这可以通过使用注释@ConfigurationProperties注入属性并打印它们来完成。

问题在于是否有更好或内置的机制来实现这一目标。

鉴于此外似乎没有内置的解决方案,我试着自己做饭。以下是我提出的建议:

@Component
public class ConfigurationDumper {


    @Autowired
    public void init(Environment env){
        log.info("{}",env);
    }

}

这样做的挑战是它不会打印我的application.yml中的变量。相反,这是我得到的:

StandardServletEnvironment 
{
    activeProfiles=[],
    defaultProfiles=[default],
    propertySources=[
        servletConfigInitParams,
        servletContextInitParams,
        systemProperties,
        systemEnvironment,
        random,
        applicationConfig: [classpath: /application.yml]
    ]
}

如何修复此问题以便加载和打印所有属性?

3 个答案:

答案 0 :(得分:3)

如果您使用actuatorenv endpoint将为您提供ConfigurableEnvironment中设置的所有配置属性,而configprops将为您提供{{ 1}},但不在日志中。

查看此@ConfigurationProperties端点的source code,可能会让您了解如何获取您感兴趣的所有属性。

答案 1 :(得分:2)

没有内置机制,它实际上取决于“所有属性”的含义。您是否只想要所写的实际密钥,或者您想要所有属性(包括默认值)。

对于前者,您可以轻松收听ApplicationEnvironmentPreparedEvent并记录您感兴趣的属性来源。对于后者,/configprops确实是更好/完整的输出。

答案 2 :(得分:0)

这仅记录配置的* .properties文件。

/**
 * maps given property names to its origin
 * @return a map where key is property name and value the origin
 */
public Map<String, String> fromWhere() {
    final Map<String, String> mapToLog = new HashMap<>();

    final MutablePropertySources propertySources = env.getPropertySources();

    final Iterator<?> it = propertySources.iterator();

    while (it.hasNext()) {
        final Object object = it.next();
        if (object instanceof MapPropertySource) {
            MapPropertySource propertySource = (MapPropertySource) object;
            String propertySourceName = propertySource.getName();

            if (propertySourceName.contains("properties")) {

                Map<String, Object> sourceMap = propertySource.getSource();

                for (String key : sourceMap.keySet()) {
                    final String envValue = env.getProperty(key);
                    String env2Val = System.getProperty(key);

                    String source = propertySource.getName().contains("file:") ? "FILE" : "JAR";

                    if (envValue.equals(env2Val)) {
                        source = "ENV";
                    }

                    mapToLog.putIfAbsent(key, source);               
                }
            }
        }
    }
    return mapToLog;
}

我的示例输出描述了属性名称,值及其来源。我的属性值是从哪里来描述的。

myprop: fooFromJar from JAR
aPropFromFile: fromExternalConfFile from FILE
mypropEnv: here from vm arg from ENV
  • ENV表示我已通过-D将其提供给JVM。
  • JAR表示它来自JAR内的application.properties
  • FILE表示它来自JAR之外的application.properties