使用 slf4j 作为 log4j2 的抽象

Using slf4j as an abstraction for log4j2

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

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()); 

其中配置器是来自 log4j2 库的 class。我们还在服务器上部署这个 log4j2.xml 文件(tomcat)

1) 我已阅读 SO link 关于 slf4j 和 log4j2 协同工作的内容。如果slf4j2是一个抽象(我把this理解为abstractclass),怎么可能初始化这个class的一个对象呢?在java中,抽象classes不能有对象

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

1) slf4j2 不是抽象 class 它只是 log4j2 的抽象。

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

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

上只使用一个实例