apache log4j在Spring中调用getLogger()后,将一个appender添加到root logger

时间:2017-03-03 12:19:11

标签: java spring dynamic log4j rollingfileappender

我正在使用Spring Boot,我有两个独立的组件。一个组件支持应用程序的数据库配置属性,并使用从数据库中提取的属性初始化Appender。然后其他组件正常调用getLogger()作为静态记录器。

目前,Spring似乎首先正在初始化应用程序配置组件,所以如果没有首先初始化它,我就无法观察到它的行为。我的问题是,如果首先初始化其他bean,那么绑定到根日志的appender是否会在运行时应用于它们,即使它们的记录器是在appender连接到root之前创建的?

示例代码:

@Component
class A {

    @PostConstruct
    private void configureSystem() {   
        EnhancedPatternLayout patternLayout = new EnhancedPatternLayout();
        patternLayout.setConversionPattern("%d{HH:mm:ss} %-5p [%t]: %m%n");
        DailyRollingFileAppender fileAppender = new DailyRollingFileAppender(patternLayout, "/logs/default.log", "'.'yyyy-MM-dd");
        fileAppender.setAppend(true);
        fileAppender.setName("DefaultAppender");
        fileAppender.setThreshold(Level.WARN);
        fileAppender.activeOptions();
        LogManager.getRootLogger().addAppender(fileAppender);
    }
}

@Component
class B {
    private static final Logger logger = LogManager.getLogger(B.class);

    public void doSomething() {
        logger.info("I did something!");
    }
}

在所有内容都加载之前,B类不会“doSomething”,但我想知道如果B会首先实例化它会影响到什么。显然没有办法告诉Spring哪个bean首先实例化,所以我无法保证配置将按照我需要的方式进行,但Spring现在首先实例化这个,所以我无法测试它。我会遇到问题吗?

1 个答案:

答案 0 :(得分:0)

看起来Spring引导首先加载A类,然后加载B类。如果B类首先加载,那么" log4j:WARN没有找到记录器的附加器"将被抛出。我认为您可以在@SpringBootApplication带注释的类中初始化记录器,或者使用将自动加载的log4j.properties文件。