【问题标题】:apache log4j Adding an appender to root logger after calling getLogger() in Springapache log4j 在 Spring 中调用 getLogger() 后向根记录器添加附加程序
【发布时间】:2017-07-23 13:19:42
【问题描述】:

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

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

所以示例代码:

@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 类不会“做某事”,但我想知道 B 类是否会首先实例化,如果这会影响任何事情。显然没有办法告诉 Spring 首先实例化哪个 bean,所以我不能保证配置会按照我需要的方式进行,但是 Spring 现在首先实例化这个,所以我无法测试它。我会遇到问题吗?

【问题讨论】:

    标签: java spring dynamic log4j rollingfileappender


    【解决方案1】:

    似乎 Spring boot 先加载 Class A,然后加载 Class B。如果先加载 Class B,则会抛出“log4j:WARN No appenders could be found for logger”。我认为您可以在 @SpringBootApplication 注释类中初始化记录器或使用将自动加载的 log4j.properties 文件。

    【讨论】:

    • 它目前是先加载它们,但我读到我不能保证它首先加载。此外,我不能使用 log4j 属性文件或 @SpringBootApplication 注释类,因为我需要使用这个特定的类来加载以满足业务需求。
    猜你喜欢
    • 2021-01-22
    • 2012-09-13
    • 1970-01-01
    • 2012-11-17
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多