【问题标题】:Log4j not initialized when logger is called from a @PostConstruct -annotated method从 @PostConstruct 注释的方法调用记录器时未初始化 Log4j
【发布时间】:2015-07-01 05:38:49
【问题描述】:

我正在使用 Spring、log4j 和 slf4j。尝试从 @PostConstruct 注释的方法记录一些信息时,log4j 抱怨尚未初始化。当我稍后从此类 log4j 登录时,它可以正常工作。

private final static Logger log = LoggerFactory.getLogger(MyClass.class);

@PostConstruct
public void init() {
    log.info("initializing service");
}

输出
log4j:WARN 找不到记录器的附加程序(mypackage.MyClass)

Log4j 配置是基于文件的配置:

log4j.rootLogger=INFO, console   
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %-5p %c %x - %m%n

【问题讨论】:

    标签: java spring log4j slf4j


    【解决方案1】:

    PostConstruct 方法由 Spring 容器在依赖注入完成后立即调用,但在 init 方法之前。所以在构建后的类实例中没有完全初始化。为此,我建议使用InitializingBeaninit-method

    【讨论】:

    • 我不想为特定于 spring 的init-method 切换标准 Java 注释,因此问题可以改写为“如何让 Spring 更早地加载 log4j.properties 资源?”。
    • 由于您必须将类传递给 LoggerFactory 方法,因此您需要先初始化该类。所以我不认为你可以早点做,你可以尝试做log变量非静态。
    • @SergeyPauk 你找到解决方案了吗?
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2018-08-23
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多