我们的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]
]
}
如何修复此问题以便加载和打印所有属性?
答案 0 :(得分:3)
如果您使用actuator,env
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