Hibernate 3.x используется slf4jдля регистрации. Hibernate 4.x используетjboss-logging. Я пишу автономное приложение, которое использует Hibernate 4 и SLF4J для ведения журнала.
Как я могу настроить Hibernate для входа в SLF4J?
Если это невозможно, как я могу вообще настроить ведение журнала Hibernate?
Раздел руководства Hibernate 4.1 по ведению журнала начинается с предупреждения, что это ...
Полностью устарело. Hibernate использует ведение журнала JBoss, начиная с версии 4.0. Это будет задокументировано, когда мы перенесем это содержимое в Руководство разработчика.
... продолжает говорить о SLF4J, и поэтому бесполезен. Ни руководство по началу работы, ни руководство разработчика вообще не говорят о ведении журнала. Нет и руководства по миграции .
Я искал документацию по самому jboss-logging, но мне не удалось ее найти. Страница GitHub молчит , а страница проектов сообщества JBoss даже не перечисляет jboss-logging. Мне было интересно, могут ли быть в системе отслеживания ошибок проекта какие-либо проблемы, связанные с предоставлением документации, но это не так.
Хорошая новость заключается в том, что при использовании Hibernate 4 внутри сервера приложений, такого как JBoss AS7, ведение журнала в значительной степени заботится о вас. Но как его настроить в отдельном приложении?
источник
Ответы:
Посмотрите https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java :
Таким образом , возможные значения
org.jboss.logging.provider
являются:jboss
,jdk
,log4j
,slf4j
.Если вы не установили,
org.jboss.logging.provider
он пробует jboss, затем log4j, затем slf4j (только если используется логбэк) и откат к jdk.Использую
slf4j
сlogback-classic
:и все нормально работает!
ОБНОВЛЕНИЕ Некоторые пользователи используют в основном App.java:
но для решений на основе контейнеров это не работает.
ОБНОВЛЕНИЕ 2 Те, кто думают, что они управляют Log4j с SLF4J, потому
jboss-logging
что это не совсем так.jboss-logging
напрямую использует Log4j без SLF4J!источник
org.jboss.logging.provider
?System.getProperty(LOGGING_PROVIDER_KEY);
вашему желанию необходимо установить системное свойство. Просмотритеjava -D...=...
или проверьте документы для вашего контейнера.Чтобы заставить SLF4J работать с JBoss Logging без Logback в качестве бэкэнда, требуется использование системного свойства
org.jboss.logging.provider=slf4j
.log4j-over-slf4j
В этом случае тактика, похоже, не работает, потому что ведение журнала вернется к JDK, если ни Logback, ни log4j на самом деле не присутствуют в пути к классам.Это немного неприятно, и для того, чтобы автоопределение работало, вы должны увидеть, что загрузчик классов содержит по крайней мере
ch.qos.logback.classic.Logger
от logback-classic илиorg.apache.log4j.Hierarchy
от log4j, чтобы обмануть ведение журнала JBoss, чтобы оно не возвращалось к ведению журнала JDK.Магия интерпретируется в
org.jboss.logging.LoggerProviders
ОБНОВЛЕНИЕ: добавлена поддержка загрузчика сервисов, поэтому можно избежать проблем с автоопределением, объявив
META-INF/services/org.jboss.logging.LoggerProvider
(сorg.jboss.logging.Slf4jLoggerProvider
как значение). Кажется, также добавлена поддержка log4j2.источник
-Dorg.jboss.logging.provider=slf4j
. LoggingProviders.java дает вам лучшее представление о текущих принятых значениях и о том, что ожидается в пути к классам.Slf4jLoggerProvider
это неpublic
класс?Вдохновленный публикацией Лейфа о Hypoport , вот как я «согнул» Hibernate 4 обратно в slf4j:
Предположим, вы используете Maven.
org.slf4j:log4j-over-slf4j
как зависимость к вашемуpom.xml
mvn dependency:tree
, убедитесь , ни один из артефактов , которые вы используете DEPENDE наslf4j:slf4j
(чтобы быть точным, не артефакт не должен иметь компиляции сфера зависимостей или выполнения области видимости зависимостьslf4j:slf4j
)Предыстория: Hibernate 4.x зависит от артефакта
org.jboss.logging:jboss-logging
. Проходной, этот артефакт имеет при условии области видимости зависимости от артефактаslf4j:slf4j
.Поскольку теперь мы добавили
org.slf4j:log4j-over-slf4j
артефакт, онorg.slf4j:log4j-over-slf4j
имитируетslf4j:slf4j
артефакт. Следовательно, все, чтоJBoss Logging
регистрируется, теперь фактически будет проходить через slf4j.Допустим, вы используете Logback в качестве бэкэнда для ведения журнала. Вот образец
pom.xml
В вашем пути к классам укажите
logback.xml
, например, этот, расположенный вsrc/main/java
:Некоторым компонентам может потребоваться иметь доступ
logback.xml
во время запуска JVM для правильного ведения журнала, например, плагин Jetty Maven. В этом случае добавьтеlogback.configurationFile=./path/to/logback.xml
в свою команду систему Java (напримерmvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
).Если вы все еще получаете "необработанный" консольный стандартный вывод Hibernate (например
Hibernate: select ...
), тогда может применяться вопрос о переполнении стека: " Отключить ведение журнала гибернации на консоли ".источник
org.jboss.logging.provider=slf4j
Сначала вы понимаете, что SLF4J - это не библиотека для ведения журнала, а его оболочка для ведения журнала. Сам он ничего не регистрирует, он просто делегирует "бэкэндам".
Чтобы «настроить» jboss-logging, вы просто добавляете любую структуру журналов, которую хотите использовать в своем пути к классам (вместе с jboss-logging), а jboss-logging вычисляет все остальное.
Я создал ориентированное на Hibernate руководство по конфигурации JBoss Logging: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html
источник
org.jboss.logging.provider
системного свойства.Я использую Hibernate Core 4.1.7.Final плюс Spring 3.1.2.RELEASE в отдельном приложении. Я добавил Log4j 1.2.17 к своим зависимостям, и, похоже, поскольку JBoss Logging ведет журнал напрямую в log4j, если он доступен, а Spring использует Commons Logging, ведьма также использует Log4j, если он доступен, все журналы можно настроить через Log4J.
Вот мой список соответствующих зависимостей:
источник
Итак, он только что заработал в моем проекте. спящий режим 4, slf4j, логбэк. мой проект - gradle, но должен быть таким же для maven.
В принципе Абдул прав. Где он НЕ прав, так это то, что вам НЕ нужно удалять slf4j из зависимостей.
включить в область компиляции:
org.slf4j: SLF4J-апи
org.slf4j: log4j-over-slf4j
например, для входа в систему (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)
полностью исключить библиотеки log4j из зависимостей
результат: журналы гибернации через slf4j для возврата. конечно, вы должны иметь возможность использовать другую реализацию журнала, чем logback
чтобы убедиться, что log4j отсутствует, проверьте свои библиотеки в пути к классам или в web-inf / lib на наличие файлов war.
конечно, вы установили регистраторы в logback.xml, например:
<logger name="org.hibernate.SQL" level="TRACE"/>
источник
В Hibernate 4.3 есть документация о том, как управлять
org.jboss.logging
:Он ищет путь к классу для поставщика журналов . Он ищет slf4j после поиска log4j. Итак, теоретически убедитесь, что ваш путь к классам (WAR) не включает log4j и действительно включает API slf4j, а серверная часть должна работать.
В крайнем случае вы можете установить для
org.jboss.logging.provider
системного свойства значениеslf4j
.Несмотря на утверждения документации,
org.jboss.logging
настаивал на попытке использовать log4j, несмотря на то, что log4j отсутствует и присутствует SLF4J, что привело к следующему сообщению в моем файле журнала Tomcat (/var/log/tomcat/catalina.out
):Мне пришлось последовать предложению ответа dasAnderl ausMinga и включить
log4j-over-slf4j
мост.источник
Я использую maven и добавил следующую зависимость:
Затем я создал
log4j.properties
файлы в/src/main/resources
:Это поместит его в корень вашего
.jar
. Работает как часы...источник
У меня возникла проблема с работой журнала hibernate 4 с weblogic 12c и log4j. Решение состоит в том, чтобы поместить в файл weblogic-application.xml следующее:
источник
Всем, кто мог столкнуться с той же проблемой, что и я. Если вы пробовали все другие решения, описанные здесь, и по-прежнему не видите, что ведение журнала гибернации работает с вашим slf4j, это может быть связано с тем, что вы используете контейнер, в библиотеках папок которого есть jboss-logging.jar. Это означает, что он предварительно загружается до того, как вы сможете установить какую-либо конфигурацию, чтобы повлиять на него. Чтобы избежать этой проблемы в weblogic, вы можете указать в файле weblogic-application.xml в вашем ухе / META-INF, чтобы отдавать предпочтение библиотеке, загруженной из приложения. аналогичный механизм должен быть и для других серверных контейнеров. В моем случае мне пришлось добавить:
источник
ты пробовал это:
- slf4j-log4j12.jar в случае Log4J. См. Документацию SLF4J для более подробной информации. Чтобы использовать Log4j, вам также необходимо поместить файл log4j.properties в путь к классам. Пример файла свойств распространяется вместе с Hibernate в каталоге src /.
просто добавьте эти банки и свойства или log4j xml в путь к классам
источник