Сбит с толку Java Logging Systems с Spring и Hibernate - PullRequest
15 голосов
/ 22 января 2010

При развертывании приложения 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 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. Это тоже обязательно?

Ответы [ 5 ]

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

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

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

  • Как настроить ведение журнала для 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 (это просто еще один формат для конфигурации) в classpath.

  • Я использую 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 в качестве каркаса логов (который является преемником log4j), вот где сейчас все и происходит.

2 голосов
/ 22 января 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 logging и slf4j - более новые API и допускают некоторые более сложные варианты использования.

1 голос
/ 22 января 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>
0 голосов
/ 16 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...