如何在spring boot server启动时查看自动配置日志输出?
我创建了一个Spring Boot应用程序。它使用了一个共享库(通过maven依赖的Spring boot jar)。共享库类是通过META-INFspring.fants加载的。
我已经提到了spring.fants中库的类。共享库的工作是从application.properties中读取Vault角色id和Vaultsecret id值,然后调用REST API从Vault中获取秘密。取到秘密后,它又在系统属性中设置值。
for (Map.Entry<String, String> entry : allSecrets.entrySet())
{
System.setProperty(entry.getKey(), entry.getValue());
}
一切都在按预期工作。但是我无法在日志中看到共享库的日志。共享库的包结构是com.myorg.abc。我的spring boot包结构是com.myorg.xyz。
我在应用程序属性中尝试了以下内容。
logging.level.root= DEBUG
logging.level.com.myorg.xyz: DEBUG
logging.level.com.myorg.abc: DEBUG
logging.level.org.springframework.boot.autoconfigure.logging=DEBUG
我只能从我的应用程序获取日志,而不能从共享库获取。但是当我把共享库的Logger.error改为System.out时,我在应用程序中得到了消息。如何在我的应用程序中查看共享库的日志。
Spring boot至少有3次初始化日志。第一次发生在SpringApplication加载的时候,它创建了一个SLF4J日志。在访问Spring中的任何东西之前,它就会创建一个SLF4J日志记录器。这将导致你选择的任何日志实现被初始化。默认情况下,它将使用Spring jar中的日志配置。在 Log4j 2 中,您可以通过将 log4j.configurationFile 设置为您所需配置的位置,将其作为系统属性或 log4j.component.properties 文件来覆盖。
Spring所做的一切都将使用这个配置进行记录,直到它再次初始化日志配置,这是由bootstrap.yml控制的。最后,你的应用程序的日志配置会被初始化,它是由application.yml或再次由bootstrap.yml配置的。
我把org.springframework.boot.env.EnvironmentPostProcessor替换成了org.springframework.context.ApplicationListener。春天的工厂 并解决了这个问题。我能够在调用应用程序时从共享库中获取日志。
我可以在调用应用程序时从共享库中获取日志。
org.springframework.context.ApplicationListener=com.mypackage.MyClassName
我的ClassName.java
public class MyClassName implements ApplicationListener<ApplicationPreparedEvent>
{
private static final Logger LOGGER = LoggerFactory.getLogger(MyClassName.class);
@Override
public void onApplicationEvent(ApplicationPreparedEvent applicationPreparedEvent)
{
ConfigurableEnvironment configurableEnvironment = applicationPreparedEvent.getApplicationContext()
.getEnvironment();
String roleId = configurableEnvironment.getProperty(Constants.VAULT_ROLE_ID_LITERAL);
String secretId = configurableEnvironment.getProperty(Constants.VAULT_SECRET_ID_LITERAL);
...
Optional<String> errorMessage = ServiceUtil.validateSystemProperty(roleId, secretId);
if (!errorMessage.isPresent())
{
Map<String, String> secret = ServiceUtil.getSecret(roleId, secretId);
for (Map.Entry<String, String> entry : secret.entrySet())
{
System.setProperty(entry.getKey(), entry.getValue());
}
LOGGER.info("Successfully populated secrets from Vault in system property");
}
else
{
LOGGER.error("Failed to populate secrets from Vault in system property. Error:{}", errorMessage.get());
}
}
}
应用程序.属性
logging.level.com.myorg.abc: DEBUG