Я работаю над проектом 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. Этот файл загружается, когда контекст сервлета инициализируется

Configurator.initialize(null, FileFinderUtil.findFile("log4j2.xml", projectName, fallback).getAbsolutePath()); 

Где конфигуратор - это класс из библиотеки log4j2. Мы также развертываем этот файл log4j2.xml на сервере (tomcat)

1) Я прочитал эту ссылку SO о slf4j и log4j2 работают вместе. Если slf4j2 - абстракция (я понимаю это как абстрактный класс), как можно инициализировать объект этого класса? В java абстрактные классы не могут иметь объектов

2) Для двоих, работающих вместе, это так, что объект slf4j пишет журналы, но на самом деле находится за сценой, используя для этого библиотеку log4j2? Может ли кто-нибудь простыми словами объяснить этот процесс?

1
overflow 14 Фев 2018 в 18:12

1 ответ

Лучший ответ

1) slf4j2 - это не абстрактный класс, это просто абстракция для log4j2.

2) log4j2 - это своего рода обертка для slf4j. Приложение java использует slf4j для ведения журнала, но tomcat использует log4j2 для ведения журнала на сервере.

Таким образом, проблема с log4j2 заключается в том, что когда на одном экземпляре tomcat развернуто много приложений, и все они имеют свой собственный экземпляр log4j2, это приводит к коллапсу на tomcat. В этой ситуации мы можем использовать несколько версий slf4j2 на сервере, и все они, в свою очередь, используют только один экземпляр на tomcat.

0
overflow 15 Фев 2018 в 14:35