【问题标题】:How to view autoconfigure log output during spring boot server start如何在 Spring Boot 服务器启动期间查看自动配置日志输出
【发布时间】:2026-02-14 10:00:01
【问题描述】:

spring boot server 启动时如何查看自动配置日志输出

我创建了一个 Spring Boot 应用程序。它使用一个共享库(通过 maven 依赖的 Spring boot jar)。共享库类通过加载 META-INF/spring.factories

我已经提到了 spring.factories 库中的类。共享库的工作是读取 Vault 角色 id 和 Vault 来自 application.properties 的秘密 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 spring-boot logging log4j slf4j


    【解决方案1】:

    Spring boot 初始化日志记录至少 3 次。第一次发生在加载 SpringApplication 时。它在访问 Spring 中的任何内容之前创建一个 SLF4J Logger。这会导致您选择初始化的任何日志记录实现。默认情况下,它将使用 Spring jar 中的日志记录配置。使用 Log4j 2,您可以通过将 log4j.configurationFile 设置为所需配置的位置作为系统属性或 log4j.component.properties 文件来覆盖它。

    Spring 所做的一切都将使用此配置进行记录,直到它再次初始化日志配置,该配置由 bootstrap.yml 控制。最后,您的应用程序的日志配置被初始化,该配置可以从 application.yml 或再次从 bootstrap.yml 配置。

    【讨论】:

      【解决方案2】:

      我在 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());
                  }
          }
      }
      

      application.properties

      logging.level.com.myorg.abc: DEBUG
      

      【讨论】: