Как просто добавить slf4j в pom.xml wrap log4j? - PullRequest
21 голосов
/ 29 декабря 2011

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

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

Ответы [ 2 ]

29 голосов
/ 30 декабря 2011

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 и внедрением зависимостей, это чистый путь к классам, загрузчик классов ...

Для получения дополнительной информации см. по ссылкам .

4 голосов
/ 29 декабря 2011

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

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

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

...