Как использовать 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. С учетом сказанного я бы ответил на ваши вопросы следующим образом:
- Программа для SLF4J. Он имеет приятный, простой API, который является всем, что вам, вероятно, понадобится в среде логирования. Кроме того, если по какой-то причине вы решите переключиться на logback или Log4J 1.2 или что-то еще вместо Log4J 2.0, вы можете просто отключить jar на бэкэнде.
- Определенно поставьте банки в приложение войны. Вы почти никогда не должны ставить банки в сервер приложений
lib
каталог. В противном случае они будут влиять на все веб-приложения на этом сервере приложений, а не только на ваше. Кроме того, банки в сервере приложенийlib
каталог не может контролироваться путем развертывания веб-приложений, но необходимо управлять вручную. - Похоже, вам понадобится
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 внесет необходимые зависимости, если вы используете это.