2017-03-03 105 views
0
调用getLogger()

我使用Spring引导和我有两个独立的组件后添加一个appender至根记录。一个组件支持应用程序的数据库配置属性,并使用从数据库中提取的属性初始化Appender。其他组件然后像平常一样调用getLogger()作为静态记录器。阿帕奇log4j的春季

目前,似乎春天首先初始化应用程序配置组件,所以我没能遵守的行为如果不首先初始化。我的问题是,如果其他bean首先被初始化,那么绑定到根日志的appender是否会在运行时应用它们,即使它们的logger是在appender连接到根之前创建的?

所以示例代码:

@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

看起来Spring引导首先加载A类,然后加载B类。如果B类加载第一个,那么将引发“log4j:WARN无法找到记录器的appender”。我想你可以在@SpringBootApplication注解类中初始化记录器,或者使用将自动加载的log4j.properties文件。

+0

它目前正在加载他们,但我读过,我不能*保证*它首先加载。此外,我不能使用log4j属性文件或@SpringBootApplication注释类,因为我需要使用此特定类来加载业务需求。 –