Озадачены системами ведения журналов Java с помощью Spring и Hibernate

При развертывании моего приложения Spring / Hibernate я получаю следующее предупреждение, связанное с ведением журнала:

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.

Меня удивило отсутствие информации из поиска Google / SO. Единственное, что имело значение, - это сообщение SO Проблема с настройкой Commons Logging / Log4j в весеннем веб-приложении с tomcat 6

Однако это даже вне меня. Может ли кто-нибудь прояснить используемые здесь системы ведения журнала или указать мне НЕДАВНИЙ ресурс по этому вопросу (есть некоторые старые результаты поиска Google, которые на самом деле не применимы). В частности, я пытаюсь решить следующие проблемы:

  • Различие между общими журналами, log4j, slf4j и JCL. Насколько я понимаю, slf4j - это оболочка, а commons-logging и log4j - фактические реализации. Я не знаю, где подходит JCL.

  • Как настроить ведение журнала для Spring. Что делает файл web.xml, нужен ли мне файл log4j.properties или файл log4j.xml? Куда это идет, в WEB-INF? Что-нибудь входит в мой файл applicationContext.xml? (извините, но здесь мне нужно начать с нуля).

  • Я использую Hibernate в своем проекте и в том числе через Maven. Похоже, что Hibernate использует slf4j-simple. Я видел предупреждения о том, что у меня не может быть slf4j-simple и slf4j-log4j в пути к классам. Я не включил slf4j-log4j в качестве зависимости, но Hibernate должен включать его. Как мне решить эту проблему? Могу ли я заставить Hibernate использовать вместо этого log4j?

Любая помощь будет принята с благодарностью. Спасибо.


редактировать:

Спасибо за все ответы. Я пробую эти предложения. А как насчет весеннего веб-приложения? Я видел примеры слушателей, параметров и еще много чего не помещали в файл web.xml. Это тоже требуется?


person D.C.    schedule 21.01.2010    source источник


Ответы (5)


  • commons-logging и SLF4J являются оболочками API для других реализаций журналирования. SLF4J является более современным из двух и более способным. Log4j - это реализация ведения журналов, которая в значительной степени является стандартом де-факто. JUL (сокращение от java.util.logging) - это ( вообще ужасно) реализация логирования, идущая с JRE. Еще одна реализация журнала - это logback, который постепенно набирает обороты, но пока еще не получил широкого распространения.
  • log4j.properties и log4j.xml - разные способы настройки log4j, оба одинаково действительны. Какой из них вы будете использовать, зависит от вас, хотя некоторые серверы приложений диктуют тот или иной вариант. Прочтите руководство по log4j, чтобы узнать, как это настроить.
  • Если Hibernate использует SLF4J в качестве API, это выбор разработчиков Hibernate. Однако вы можете выбрать, какую реализацию ведения журнала будет делегировать SLF4J. Снова прочтите руководство по slf4j, чтобы узнать, как выбрать выбранную реализацию.

Да, это все довольно запутанно. При открытом выборе SLF4J и Logback являются наиболее подходящей комбинацией, но обычно вы не получаете открытого выбора. Различные фреймворки (например, Hibernate и Spring) потенциально будут использовать разные API-интерфейсы журналирования, обычно commons-logging или SLF4J, но вы можете заставить все эти API-интерфейсы в конечном итоге входить в одну и ту же базовую реализацию (обычно log4j).

person skaffman    schedule 21.01.2010

  • Различие между общими журналами, log4j, slf4j и JCL. Насколько я понимаю, slf4j - это оболочка, а commons-logging и log4j - фактические реализации. Я не знаю, где подходит JCL.

Jakarta Commons Logging (JCL) и Simple Logging Facade для Java SLF4J являются абстракциями для различных платформ ведения журналов, например java.util.logging, log4j и logback, позволяя конечному пользователю подключить желаемую платформу ведения журнала во время развертывания. Ведение журнала Commons, как известно, страдает от проблем с загрузчиком классов, которые SLF4J пытается решить (известно, что SLF4J является более чистой библиотекой).

При этом факт заключается в том, что Spring использует Jakarta Commons Logging API (см. Регистрация зависимостей в Spring): Spring скомпилирован с использованием JCL, и Spring делает объекты JCL Log доступными для классов, расширяющих Spring. Фактически, это единственная обязательная внешняя зависимость в Spring. Этот выбор был сделан, потому что многие другие фреймворки также его используют (например, Struts ). Идея заключалась в том, чтобы избежать необходимости иметь несколько библиотек фасадов на пути к классам при создании приложений («A» для Spring, «B» для Struts и т. Д.). Тем не менее, возможно заменить JCL на SLF4J, если хотите (SFL4J обеспечивает привязки к фреймворкам журналирования, а также мост «JCL к SLF4J»). См. Упомянутый пост Logging Dependencies in Spring для все подробности.

  • Как настроить ведение журнала для Spring. Что делает файл web.xml, нужен ли мне файл log4j.properties или файл log4j.xml? Куда это идет, в WEB-INF? Что-нибудь входит в мой файл applicationContext.xml? (извините, но здесь мне нужно начать с нуля).

Для ведения журнала вам необходимо: 1. решить, какую реализацию вы хотите использовать (java.util.logging, log4j или logback), 2. при необходимости поместить выбранный вариант в путь к классам (java.util.logging находится в Java SE, поэтому он не требует дополнительных библиотек) и 3. для его настройки (помещая файл конфигурации в путь к классам). Если вы решите использовать log4j, просто добавьте его jar и log4j.properties или более причудливый (но более подробный) log4j.xml (это просто другой формат конфигурации) в путь к классам.

  • Я использую Hibernate в своем проекте и в том числе через Maven. Похоже, что Hibernate использует slf4j-simple. Я видел предупреждения о том, что у меня не может быть slf4j-simple и slf4j-log4j в пути к классам. Я не включил slf4j-log4j в качестве зависимости, но Hibernate должен включать его. Как мне решить эту проблему? Могу ли я заставить Hibernate использовать вместо этого log4j?

Hibernate использует Simple Logging Facade для Java (SLF4J) и, действительно, у вас не может быть нескольких привязок (например, slf4j-simple.jar и slf4j-logj12.jar) в пути к классам одновременно. Здесь вы, скорее всего, переходите slf4j-simple.jar из другой зависимости. Чтобы решить эту проблему, запустите mvn dependency:tree, чтобы выяснить, откуда он исходит, и при необходимости исключить его.

И, кстати, в вашем случае я бы настроил Spring на использование SLF4J, поскольку Hibernate использует его. Для этого следуйте инструкциям по ссылке, указанной в первом абзаце. И я бы использовал логбэк в качестве фреймворка логирования (который является преемником log4j), вот где сейчас что-то происходит.

person Pascal Thivent    schedule 21.01.2010

Вам нужен файл log4j.properties в пути к классам. Вот минимальный файл свойств, который я создал вчера:

log4j.logger.BillReview=INFO,BillReviewLog
log4j.appender.BillReviewLog=org.apache.log4j.RollingFileAppender
log4j.appender.BillReviewLog.File=BillReview.log
log4j.appender.BillReviewLog.Append=true
log4j.appender.BillReviewLog.MaxFileSize=5000KB
log4j.appender.BillReviewLog.MaxBackupIndex=5
log4j.appender.BillReviewLog.layout=org.apache.log4j.PatternLayout
log4j.appender.BillReviewLog.layout.ConversionPattern=%c %p %-10.10X{server} %-4.4X{user} %d{ISO8601} %m%n

Поместите это в файл log4j.properties, измените все ссылки на BillReview на что-то более похожее на ваш проект, и он войдет в файл и остановит эти сообщения.

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

person MattGrommes    schedule 21.01.2010

Я позволю более опытным Гуру, чем я, отвечу на первый пункт.

Отвечая на вашу вторую пулю ...

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

src / main / java - поместите сюда основной источник
src / main / resources - поместите ресурсы, используемые вами основным источником здесь
src / test / java - поместите сюда тестовый источник (для тестов)
src / test / resources - поместите сюда ресурсы для тестов

Поэтому вы должны поместить свой log4j.properties в каталог src / test / resources.

Отвечая на вашу третью пулю ...

Вы можете исключить зависимость внутри зависимости в вашем файле pom.xml, выполнив следующие действия ...

<dependency>
    <groupId>org.apache.xbean</groupId>
    <artifactId>xbean-spring</artifactId>
    <version>${xbean.version}</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
person Michael Balint    schedule 21.01.2010

У меня были проблемы в той же области при выполнении тестов. В конце концов я заметил, что junit привносит slf4j-nop в качестве зависимости в дополнение к slf4j-log4j12, которое я хотел. Как только я исключил slf4j-nop, заработало.

person Grimarr    schedule 16.04.2010