Baffled системами регистрации Java с помощью Spring и спящего режима

При развертывании моего приложения 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 в Spring webapp с 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 вместо этого?

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


Редактирование:

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Сказав это, факт состоит в том, что Spring использует Jakarta Commons Logging API (см. Зависимости регистрации в Spring): Spring скомпилирован против JCL и Spring делает объекты JCL Log доступными для классов, расширяющих Spring. Фактически это единственная обязательная внешняя зависимость в Spring. Этот выбор был сделан, потому что многие другие фреймворки также используют его (например, Struts). Идея состояла в том, чтобы избежать необходимости иметь несколько библиотек фасадов в пути класса при создании приложений ( "A" для Spring, "B" для Struts и т.д.). Тем не менее возможно заменить JCL на SLF4J, если вы хотите (SFL4J обеспечивает привязки к фреймворкам регистрации, а также мост "JCL to SLF4J" ). См. Упомянутый пост Зависимости регистрации в 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 использует его. Для этого выполните действия, указанные в первом абзаце. И я бы использовал logback как фреймворк logging (который является преемником log4j), вот что происходит сейчас.

Ответ 3

Вам нужен файл 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-интерфейсы и позволяют использовать более сложные варианты использования.

Ответ 4

Я дам несколько более опытных Гуру, чем я отвечу на первую пулю.

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

Вы можете использовать файл 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>

Ответ 5

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