[英]How to view autoconfigure log output during spring boot tests (integration tests)
[英]How to view autoconfigure log output during spring boot server start
如何在 spring 引導服務器啟動期間查看自動配置日志 output
我創建了一個 spring 引導應用程序。 它使用共享庫(Spring boot jar 通過 maven 依賴項)。 共享庫 class 通過 META-INF/spring.factories 加載
我在 spring.factories 中提到了庫中的類。 共享庫的工作是從 application.properties 中讀取 Vault 角色 id 和 Vault secret id 值,並調用 REST API 並從 Vault 中獲取機密。 獲取秘密后,它會在系統屬性中再次設置該值。
for (Map.Entry<String, String> entry : allSecrets.entrySet())
{
System.setProperty(entry.getKey(), entry.getValue());
}
一切都按預期工作。 但我無法在我的日志中看到來自共享庫的日志。 共享庫的 package 結構為 com.myorg.abc。 我的 spring 啟動 package 結構是 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.proper
Spring 所做的一切都將使用此配置記錄,直到它再次初始化記錄配置,這由 bootstrap.yml 控制。 最后,您的應用程序的日志配置被初始化,該配置可以從 application.yml 或再次從 bootstrap.yml 配置。
我用Spring.factories中的 org.springframework.context.ApplicationListener 替換了 org.springframework.boot.env.EnvironmentPostProcessor 並解決了這個問題。 我能夠在調用應用程序時從共享庫中獲取日志。
Spring.factories
org.springframework.context.ApplicationListener=com.mypackage.MyClassName
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.