Как использовать log4j 2.0 и slf4j и Commons Logging вместе

В настоящее время я запускаю новое Webapp (работающее на tomcat 6). У меня есть компоненты, использующие slf4j, и компоненты, использующие ведение журналов общего пользования. Я планирую использовать log4j 2.0 в качестве реализации журнала по нескольким причинам (в основном для аппендеров:SocketAppender и SyslogAppender, но также из-за способствовал перезагрузке конфига без потери событий журнала)

Теперь мои вопросы: - Для какого интерфейса я программирую свои новые классы? loag4j или slf4j? или даже регистрация общих?

  • Какой предпочтительный способ развернуть банки? положить их в мою войну приложений или я положил их в libs tomcat?

  • Какие банки мне нужно развернуть? log4j (включая привязки slf4j и commons), ведение журнала общих ресурсов (slf4j-api-1.7.2.jar) и api slf4j (slf4j-api-1.7.2.jar)

3 ответа

Решение

Для какого интерфейса я программирую свои новые классы? loag4j или slf4j?

Если вы собираетесь использовать SLF4J, запрограммируйте этот интерфейс. Он предлагает наибольшую гибкость для базовой реализации ведения журнала. Смысл slf4j в том, чтобы быть интерфейсом, который вы можете программировать, поэтому в будущем, если вы решите переключиться, скажем, на logback, вам не придется переписывать свой код.

Какой предпочтительный способ развернуть банки? положить их в мою войну приложений или я положил их в libs tomcat?

Поместите их в свою войну.

Единственная причина (imo) для размещения JAR-файлов в каталоге библиотек Tomcat - это необходимость загрузки собственной библиотеки. Поскольку Java не позволяет вам загружать одну и ту же нативную библиотеку из двух разных загрузчиков классов, вам нужно поместить ее в общее место. Но это не относится здесь.

Некоторые люди считают каталог lib способом экономии места. Это могло быть допустимо, когда на машинах серверного класса было 1 ГБ ОЗУ, но это больше не так. И избегая lib означает, что вы избегаете большинства трудных для отладки проблем с загрузкой классов.

Какие банки мне нужно развернуть?

  • slf4j-api - это базовый API
  • slf4j-log4j12 направляет фактическое ведение журнала в Log4J
  • jcl-over-slf4j перехватывает Commons Logging и направляет его через SLF4J (в Log4J)
  • log4j будет вашей физической структурой регистрации

Я предполагаю, что у вас уже есть конфигурация для Log4J и / или вам удобно писать эту конфигурацию. Если нет, и все, что вас волнует, это иметь дело с кодом, который использует Log4J внутри, есть log4j-over-slf4j, который будет перехватывать звонки Log4J. Затем вам нужно выбрать рамки, такие как Logback.

(примечание: я изначально добавил ссылки на все эти пакеты, но у меня недостаточно представителей, чтобы опубликовать их. Итак, вот одна ссылка на репозиторий Maven со всеми выделенными пакетами SLF4J)

Я использую slf4j с log4j2 и использую

slf4j-api-1.7.12.jar
log4j-api-2.2.jar
log4j-core-2.2.jar
log4j-slf4j-impl-2.2.jar
jcl-over-slf4j-1.7.12.jar(get rid of commons logging jars)

если ваш сервер приложений имеет конфликтующие версии, вам может потребоваться переопределить с помощью некоторых настроек загрузчика классов, определенных поставщиком

например, в weblogic 12 c у меня есть это в моем weblogic.xml внутри src/main/webapp/WEB-INF

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app 
xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 
http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.5/weblogic-web-app.xsd">
<container-descriptor>
    <prefer-application-packages>
        <package-name>org.apache.log4j.*</package-name>
        <package-name>org.apache.commons.logging.*</package-name>
        <package-name>org.apache.commons.lang.*</package-name>
        <package-name>org.apache.commons.io.*</package-name>
        <package-name>org.apache.commons.collections4.*</package-name>
        <package-name>org.slf4j.*</package-name>
    </prefer-application-packages>
</container-descriptor>
<jsp-descriptor>
    <keepgenerated>true</keepgenerated>
    <debug>true</debug>
</jsp-descriptor>
<context-root>/cnfg</context-root>
</weblogic-web-app>

Обратите внимание, что я не использовал Log4J 2.0, хотя я использовал SLF4J с Log4J 1.2. С учетом сказанного я бы ответил на ваши вопросы следующим образом:

  1. Программа для SLF4J. Он имеет приятный, простой API, который является всем, что вам, вероятно, понадобится в среде логирования. Кроме того, если по какой-то причине вы решите переключиться на logback или Log4J 1.2 или что-то еще вместо Log4J 2.0, вы можете просто отключить jar на бэкэнде.
  2. Определенно поставьте банки в приложение войны. Вы почти никогда не должны ставить банки в сервер приложений lib каталог. В противном случае они будут влиять на все веб-приложения на этом сервере приложений, а не только на ваше. Кроме того, банки в сервере приложений lib каталог не может контролироваться путем развертывания веб-приложений, но необходимо управлять вручную.
  3. Похоже, вам понадобится slf4j-api-1.7.2.jar, log4j-to-slf4j-2.0-beta4.jar, log4j-2.0-beta4.jar а также log4j-core-2.0-beta4.jar наряду с любыми зависимостями. Я уверен, что Maven внесет необходимые зависимости, если вы используете это.
Другие вопросы по тегам