如何在春季引导服务器启动期间查看自动配置日志输出
我创建了一个弹簧启动应用程序。它使用共享库(通过 maven 依赖项的 Spring boot jar(。共享库类通过以下方式加载 元信息/弹簧工厂
我已经提到了春季工厂图书馆的类。共享库的工作是读取保险柜角色 ID 和保险柜 来自 application.properties 的机密 id 值,并调用 REST API 并从保管库获取机密。获取机密后,它会在系统属性中再次设置值。
for (Map.Entry<String, String> entry : allSecrets.entrySet())
{
System.setProperty(entry.getKey(), entry.getValue());
}
一切都按预期工作。但是我无法在日志中看到共享库中的日志。 共享库的包结构是com.myorg.abc。我的 Spring 引导包结构 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 引导至少初始化日志记录 3 次。第一个发生在加载 SpringApplication 时。它会在访问 Spring 中的任何内容之前创建一个 SLF4J 记录器。这会导致您选择初始化的任何日志记录实现。默认情况下,它将使用 Spring jar 中的日志记录配置。使用 Log4j 2,您可以通过将 log4j.configurationFile 设置为所需配置的位置作为系统属性或 log4j.component.properties 文件来覆盖此设置。
Spring 所做的一切都将使用此配置进行记录,直到它再次初始化日志记录配置,该配置由 bootstrap.yml 控制。最后,初始化应用程序的日志记录配置,该配置从 application.yml 或再次从 bootstrap.yml 配置。
我在Spring.factory中将org.springframework.boot.env.EnvironmentPostProcessor替换为org.springframework.context.ApplicationListener,它解决了这个问题。我能够在调用应用程序中从共享库中获取日志。
春季工厂
org.springframework.context.ApplicationListener=com.mypackage.MyClassName
我的类名.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