簡體   English   中英

如何在 spring 引導服務器啟動期間查看自動配置日志 output

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM