我正在使用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现在首先实例化这个,所以我无法测试它。我会遇到问题吗?
答案 0 :(得分:0)
看起来Spring引导首先加载A类,然后加载B类。如果B类首先加载,那么" log4j:WARN没有找到记录器的附加器"将被抛出。我认为您可以在@SpringBootApplication带注释的类中初始化记录器,或者使用将自动加载的log4j.properties文件。