使用slf4j作为log4j2的抽象

时间:2018-02-14 15:12:30

标签: java logging slf4j log4j2

我正在开发一个JAVA项目,其中代码中的所有日志记录都是使用slf4j完成的。 e.g。

package my.project.package;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


    public class MyClass {

        private Logger logger = LoggerFactory.getLogger(MyClass.class);

        //some attributes, their getters and setters


        public void initialize() {
        //some code

        logger.info("Data received successfully!");

        //some code

    }
}

现在,我们还有一个log4j2.xml文件。当通过

初始化servlet上下文时,将加载此文件
Configurator.initialize(null, FileFinderUtil.findFile("log4j2.xml", projectName, fallback).getAbsolutePath()); 

其中configurator是log4j2库中的一个类。我们还在服务器(tomcat)上部署了这个log4j2.xml文件

1)我已阅读有关slf4j和log4j2一起工作的this SO链接。如果slf4j2是一个抽象(我理解为抽象类),那么如何初始化这个类的对象呢?在java中,抽象类不能有对象

2)对于两个一起工作,是不是slf4j对象正在写日志但实际上是在使用log4j2库的场景后面?有些机构可以用简单的术语解释这个过程吗?

1 个答案:

答案 0 :(得分:0)

1)slf4j2不是一个抽象类,它只是log4j2的抽象。

2)log4j2是slf4j的包装器。 java应用程序使用slf4j进行日志记录,但tomcat使用log4j2在服务器上进行日志记录。

因此log4j2的问题在于,当tomcat的一个实例部署了许多应用程序并且它们都有自己的log4j2实例时,这会导致tomcat崩溃。对于这种情况,我们可以在服务器上使用多个版本的slf4j2,而它们在tomcat上只使用一个实例。