Подтвердить что ты не робот

Как просто добавить slf4j в pom.xml wrap log4j?

Из того, что я видел в примере spring pom.xml, является то, что они добавляют несколько записей для slf4j и log4j, и как-то, когда вы используете log4j в своем приложении spring, он будет обернут библиотекой slf4j.

Может кто-нибудь объяснить мне, как это волшебство происходит?

4b9b3361

Ответ 1

Spring по-прежнему использует commons-logging для всех внутренних протоколов (обратная совместимость). Если вы хотите использовать другую структуру ведения журнала (log4j), вам необходимо перевести вызовы из commons logging в вашу выборку. В противном случае вам придется поддерживать несколько конфигураций протоколирования.

slf4j действует как простой фасад для различных фреймворков каротажа (jul, log4j, jcl, logback) и позволяет подключать требуемую структуру ведения журнала во время развертывания.

Вместо использования реализации фреймворка регистрации, который накладывается сторонней структурой, вы предоставляете реализацию моста slf4j's, которая действует как реальная вещь, но на самом деле просто перенаправляет вызовы журнала на slf4j или его конкретную привязку.

Раздел ведения журнала Maven pom.xml обычно выглядит следующим образом:

<!-- remove the real commons-logging from classpath -->
<!-- declare as provided or exclude from spring jars -->
<dependency>
    <artifactId>commons-logging</artifactId>
    <groupId>commons-logging</groupId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>

<!-- add slf4j interfaces to classpath -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.4</version>
    <scope>compile</scope>
</dependency>

<!-- add commons logging to slf4j bridge to classpath --> 
<!-- acts as jcl but routes commons-logging calls to slf4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.4</version>
    <scope>runtime</scope>
</dependency>

<!-- add log4j binding to classpath -->
<!-- routes slf4j calls to log4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.4</version>
    <scope>runtime</scope>
</dependency>

<!-- add log4j to classpath -->
<!-- does the logging -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
</dependency>

Это не имеет никакого отношения к контейнеру Spring или инъекции зависимостей, это чистый класс pathpath, материал загрузчика классов...

Подробнее см. в отношении.

Ответ 2

slf4j - это API протоколирования, который ничего не делает, просто связка интерфейсов. log4j - система каротажа с конкретными классами. существует библиотека slf4j-log4j, которая использует log4j в качестве backend для API slf4j.

Некоторые проекты явно зависят от log4j, они называют конкретные классы. Таким образом, вы не можете использовать другой бэкэнд (например, logback или j.u.l или apache commons или что-то еще) для своего проекта, который вы мудро сделали, используя только API slf4j.

Существует трюк, чтобы заменить классы log4j макетной реализацией (мостом), которая просто перенаправляет все вызовы на sl4j. В maven вы просто объявляете зависимость с очень высоким номером версии, и этот макет считается ультрасовременной библиотекой log4j.