Hibernate 3.x utilisé slf4jpour la journalisation. Utilisations d'Hibernate 4.xjboss-logging. J'écris une application autonome qui utilise Hibernate 4 et SLF4J pour la journalisation.
Comment puis-je configurer Hibernate pour me connecter à SLF4J?
Si ce n'est pas possible, comment puis-je configurer la journalisation d'Hibernate?
La section du manuel Hibernate 4.1 sur la journalisation commence par l'avertissement qu'il s'agit ...
Complètement obsolète. Hibernate utilise JBoss Logging à partir de la version 4.0. Cela sera documenté lors de la migration de ce contenu vers le Guide du développeur.
... continue en parlant de SLF4J, et est donc inutile. Ni le guide de démarrage ni le guide du développeur ne parlent du tout de journalisation. Le guide de migration non plus .
J'ai cherché de la documentation sur jboss-logging lui-même, mais je n'ai pas pu en trouver du tout. La page GitHub est silencieuse et la page des projets communautaires de JBoss ne répertorie même pas la journalisation jboss. Je me suis demandé si le suivi des bogues du projet pouvait avoir des problèmes liés à la fourniture de documentation, mais ce n'est pas le cas.
La bonne nouvelle est que lorsque vous utilisez Hibernate 4 dans un serveur d'applications, tel que JBoss AS7, la journalisation est en grande partie prise en charge pour vous. Mais comment puis-je le configurer dans une application autonome?
la source
Réponses:
Regardez sur https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java :
Ainsi , les valeurs possibles pour
org.jboss.logging.provider
sont:jboss
,jdk
,log4j
,slf4j
.Si vous ne le définissez pas,
org.jboss.logging.provider
il essaie jboss, puis log4j, puis slf4j (uniquement si logback est utilisé) et revient à jdk.J'utilise
slf4j
aveclogback-classic
:et tout fonctionne bien!
MISE À JOUR Certains utilisateurs utilisent dans la très principale App.java:
mais pour les solutions basées sur des conteneurs, cela ne fonctionne pas.
UPDATE 2 Ceux qui pensent gérer Log4j avec SLF4J car
jboss-logging
ce n'est pas exactement ainsi.jboss-logging
utilise directement Log4j sans SLF4J!la source
org.jboss.logging.provider
?System.getProperty(LOGGING_PROVIDER_KEY);
vous, vous devez définir la propriété système. Viajava -D...=...
ou consultez les documents de votre conteneur.Pour que SLF4J fonctionne avec JBoss Logging sans Logback en tant que backend, il faut utiliser une propriété système
org.jboss.logging.provider=slf4j
.log4j-over-slf4j
tactics ne semble pas fonctionner dans ce cas parce que la journalisation retournera à JDK si ni Logback ni log4j ne sont réellement présents dans classpath.C'est un peu gênant et pour que la détection automatique fonctionne, vous avez vu que le chargeur
ch.qos.logback.classic.Logger
de classe contient au moins de logback-classic ouorg.apache.log4j.Hierarchy
de log4j pour empêcher JBoss Logging de ne pas revenir à la journalisation JDK.La magie est interprétée à
org.jboss.logging.LoggerProviders
MISE À JOUR: la prise en charge du chargeur de service a été ajoutée, il est donc possible d'éviter les problèmes de détection automatique en déclarant
META-INF/services/org.jboss.logging.LoggerProvider
(avecorg.jboss.logging.Slf4jLoggerProvider
comme valeur). Il semble y avoir également un support supplémentaire log4j2.la source
-Dorg.jboss.logging.provider=slf4j
suffit. LoggingProviders.java vous donne de meilleures informations sur les valeurs actuellement acceptées et sur ce qui doit être présent dans le chemin de classe.Slf4jLoggerProvider
n'est pas unepublic
classe?Inspiré par l'article de Leif sur Hypoport, voici comment j'ai «replié» Hibernate 4 vers slf4j:
Supposons que vous utilisez Maven.
org.slf4j:log4j-over-slf4j
tant que dépendance à votrepom.xml
mvn dependency:tree
, assurez-vous qu'aucun des artefacts que vous utilisez ne dépendslf4j:slf4j
(pour être précis, aucun artefact ne doit avoir une dépendance de portée de compilation ou une dépendance de portée d' exécutionslf4j:slf4j
)Contexte: Hibernate 4.x a une dépendance sur l'artefact
org.jboss.logging:jboss-logging
. De manière transitoire, cet artefact a une dépendance de portée fournie sur l'artefactslf4j:slf4j
.Comme nous avons maintenant ajouté l'
org.slf4j:log4j-over-slf4j
artefact,org.slf4j:log4j-over-slf4j
imite l'slf4j:slf4j
artefact. Par conséquent, tout ce quiJBoss Logging
enregistre sera désormais transféré via slf4j.Disons que vous utilisez Logback comme backend de journalisation. Voici un échantillon
pom.xml
Sur votre chemin de classe, ayez un
logback.xml
, tel que celui-ci, situé danssrc/main/java
:Certains composants peuvent souhaiter avoir accès au moment
logback.xml
du démarrage de la JVM pour une journalisation appropriée, par exemple le plug-in Jetty Maven. Dans ce cas, ajoutez un système Javalogback.configurationFile=./path/to/logback.xml
à votre commande (par exemplemvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
).Si vous obtenez toujours une sortie de mise en veille prolongée stdout de la console "brute" (comme
Hibernate: select ...
), la question de Stack Overflow " Désactiver la journalisation de mise en veille prolongée sur la console " peut s'appliquer.la source
org.jboss.logging.provider=slf4j
Tout d'abord, vous réalisez que SLF4J n'est pas un droit de bibliothèque de journalisation, c'est un wrapper de journalisation. Il n'enregistre rien lui-même, il délègue simplement aux "backends".
Pour "configurer" jboss-logging, il vous suffit d'ajouter le framework de journal que vous souhaitez utiliser sur votre chemin de classe (avec jboss-logging) et jboss-logging comprend le reste.
J'ai créé un guide de configuration de JBoss Logging axé sur Hibernate: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html
la source
org.jboss.logging.provider
propriété système.J'utilise Hibernate Core 4.1.7.Final plus Spring 3.1.2.RELEASE dans une application autonome. J'ai ajouté Log4j 1.2.17 à mes dépendances et il semble, comme JBoss Logging se connecte directement à log4j si disponible et que Spring utilise Commons Logging, qui utilise également Log4j si disponible, toute la journalisation peut être configurée via Log4J.
Voici ma liste de dépendances pertinentes:
la source
alors, je l'ai juste fait fonctionner dans mon projet. hibernate 4, slf4j, connexion. mon projet est gradle, mais devrait être le même pour maven.
Fondamentalement, Abdull a raison. Là où il n'a PAS raison, c'est que vous ne devez PAS supprimer slf4j des dépendances.
include pour compiler la portée:
org.slf4j: slf4j-api
org.slf4j: log4j-over-slf4j
par exemple pour logback (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)
exclure complètement les bibliothèques log4j des dépendances
résultat: mise en veille prolongée des journaux via slf4j pour se connecter. bien sûr, vous devriez pouvoir utiliser une implémentation de journal différente de celle de la connexion
pour être sûr qu'aucun log4j n'est présent, vérifiez vos bibliothèques sur classpath ou web-inf / lib pour les fichiers war.
bien sûr, vous avez défini les enregistreurs dans logback.xml, par exemple:
<logger name="org.hibernate.SQL" level="TRACE"/>
la source
Hibernate 4.3 a une documentation sur la façon de contrôler
org.jboss.logging
:Il recherche le chemin de classe pour un fournisseur de journalisation . Il recherche slf4j après avoir recherché log4j. Donc, en théorie, s'assurer que votre classpath (WAR) n'inclut pas log4j et inclue l'API slf4j et un back-end devrait fonctionner.
En dernier recours, vous pouvez définir la
org.jboss.logging.provider
propriété système surslf4j
.Malgré les affirmations de la documentation,
org.jboss.logging
j'ai insisté pour essayer d'utiliser log4j, malgré l'absence de log4j et la présence de SLF4J, ce qui a entraîné le message suivant dans mon fichier journal Tomcat (/var/log/tomcat/catalina.out
):J'ai dû suivre la suggestion de la réponse de dasAnderl ausMinga et inclure le
log4j-over-slf4j
pont.la source
J'utilise maven et j'ai ajouté la dépendance suivante:
Ensuite, j'ai créé un
log4j.properties
fichier dans/src/main/resources
:Cela le mettra à la racine de votre
.jar
. Il fonctionne comme un charme...la source
J'ai eu un problème pour que la journalisation de Hibernate 4 fonctionne avec weblogic 12c et log4j. La solution est de mettre ce qui suit dans votre weblogic-application.xml:
la source
À tous ceux qui pourraient faire face au même problème que moi. Si vous avez essayé toutes les autres solutions expliquées ici et que vous ne voyez toujours pas la journalisation de la mise en veille prolongée fonctionner avec votre slf4j, cela peut être dû au fait que vous utilisez un conteneur qui a dans ses bibliothèques de dossiers le jboss-logging.jar. Cela signifie que cela est préchargé avant même de pouvoir définir une configuration pour l'influencer. Pour éviter ce problème dans weblogic vous pouvez spécifier dans le fichier weblogic-application.xml dans votre oreille / META-INF de préférer la bibliothèque chargée à partir de l'application. il devrait y avoir un mécanisme similaire pour les autres conteneurs de serveur. Dans mon cas, j'ai dû ajouter:
la source
avez-vous essayé ceci:
- slf4j-log4j12.jar dans le cas de Log4J. Consultez la documentation SLF4J pour plus de détails. Pour utiliser Log4j, vous devrez également placer un fichier log4j.properties dans votre chemin de classe. Un exemple de fichier de propriétés est distribué avec Hibernate dans le répertoire src /
ajoutez simplement ces jars et propriétés ou log4j xml dans le classpath
la source