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

问题描述 投票:0回答:1

如何在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 spring-boot logging log4j slf4j
1个回答
0
投票

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

Spring所做的一切都将使用这个配置进行记录,直到它再次初始化日志配置,这是由bootstrap.yml控制的。最后,你的应用程序的日志配置会被初始化,它是由application.yml或再次由bootstrap.yml配置的。


0
投票

我把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
© www.soinside.com 2019 - 2024. All rights reserved.