2010-01-21 4 views
15

lors du déploiement de mon printemps/application Hibernate, je reçois l'avertissement suivant lié à l'exploitation forestière:déconcertés par Java Logging Systems avec Spring et Hibernate

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

Surprenant pour moi était le manque d'information d'un Google/recherche SO . La seule chose pertinente était ce post SO Problem with Commons Logging/Log4j setup in spring webapp with tomcat 6

Cependant, c'est même au-delà de moi. Quelqu'un peut-il clarifier les systèmes de journalisation en jeu ici, ou me diriger vers une ressource RÉCENTE sur le sujet (il y a quelques anciens résultats de recherche google qui ne s'appliquent pas vraiment). Plus précisément, les questions que je suis aux prises avec sont:

  • La distinction entre les commons-logging, log4j, slf4j et JCL. Ma compréhension est que slf4j est un wrapper, tandis que commons-logging et log4j sont des implémentations réelles. Je ne sais pas où JCL s'intègre.

  • Comment configurer la journalisation pour Spring. Que fait le fichier web.xml, ai-je besoin d'un fichier log4j.properties ou d'un fichier log4j.xml? Où ça va, dans WEB-INF? Est-ce que quelque chose va dans mon fichier applicationContext.xml? (désolé mais je dois partir de zéro ici). J'utilise Hibernate dans mon projet et notamment via Maven. Il semble que Hibernate utilise slf4j-simple. J'ai vu des avertissements disant que je ne peux pas avoir slf4j-simple et slf4j-log4j tous les deux sur le classpath. Je n'ai pas inclus slf4j-log4j en tant que dépendance, mais Hibernate doit l'inclure. Comment puis-je résoudre ce problème? Puis-je forcer Hibernate à utiliser log4j à la place?

Toute aide serait grandement appréciée. Merci.


modifier:

Merci pour toutes les réponses à ce jour. Je donne ces suggestions un essai. Qu'en est-il de l'application Web de printemps en particulier? J'ai vu des exemples d'écouteurs et de paramètres et ce que l'on ne met pas dans le fichier web.xml. Est-ce également nécessaire?

Répondre

12
  • commons-logging et SLF4J sont à la fois Wrappers API autour d'autres implémentations de journalisation. SLF4J est le plus moderne des deux, et plutôt plus capable. Log4j est une implémentation de journalisation, et à peu près le standard de facto. JUL (abréviation de java.util.logging) est l'implémentation de journalisation (généralement horrible) fournie avec le JRE. Une autre implémentation de journal est logback, qui gagne lentement en traction, mais pas encore très répandue.
  • log4j.properties et log4j.xml sont différentes façons de configurer log4j, les deux sont également valables. Celui que vous utilisez est à vous, bien que certains serveurs d'applications dictent l'un ou l'autre. Lisez le log4j manual pour savoir comment configurer ceci.
  • Si Hibernate utilise SLF4J comme API, c'est le choix des développeurs Hibernate. Cependant, vous pouvez choisir l'implémentation de journalisation à laquelle SLF4J va déléguer. Encore une fois, lisez le slf4j manual pour savoir comment sélectionner votre implémentation choisie.

Oui, tout est plutôt confus. Compte tenu d'un choix ouvert, SLF4J et Logback sont la combinaison la plus efficace, mais vous n'avez généralement pas le choix. Différents frameworks (comme Hibernate et Spring) utiliseront potentiellement différentes API de journalisation, généralement commons-logging ou SLF4J, mais vous pouvez obtenir que toutes ces API se connectent à la même implémentation sous-jacente (habituellement log4j).

+0

excellente réponse skaffman – underdog

2

Vous avez besoin d'un fichier log4j.properties dans votre chemin de classe. Voici un fichier propriétés minimales je me trouvais avoir créé hier:

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 

Mettez cela dans un fichier log4j.properties, changer toutes les références à la « BillReview » à quelque chose comme votre projet et qui va connecter à un fichier et arrêter ces messages. Vos questions sur le cadre de journalisation sont en grande partie des choix personnels.

Log4j est l'ancienne norme et fonctionne très bien, la journalisation des communes et slf4j sont des API plus récentes et permettent des cas d'utilisation plus complexes.

1

Je vais laisser certains gourous plus expérimentés que moi répondre à la première balle.

répondre à votre seconde balle ...

Vous pouvez utiliser un fichier log4j.properties ou log4j.xml (il n'a pas d'importance). Quoi que vous choisissiez, vous devriez l'ajouter à votre classpath (généralement, il devrait aller dans le même répertoire que votre code source). Si vous utilisez Spring, une bonne façon de décomposer votre répertoire src en portions logiques consiste à utiliser la structure de répertoire suivante ...

src/main/java - mettre principale source ici
src/main/ressources - ressources mises utilisées par vous la principale source ici
src/test/java - source de test mis ici (pour les tests)
src/test/resources - mettre des ressources pour les tests ici

Vous devez donc mettre votre log4j.properties dans le répertoire src/test/resources.

Répondre à votre troisième balle ...

Vous pouvez exclure une dépendance au sein d'une dépendance en vous pom.xml fichier en procédant comme suit ...

<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> 
4
  • La distinction entre les commons-logging, log4j, slf4j et JCL. Ma compréhension est que slf4j est un wrapper, tandis que commons-logging et log4j sont des implémentations réelles. Je ne sais pas où JCL s'intègre.

Jakarta Commons Logging (JCL) et la façade Logging simple pour Java SLF4J sont les deux abstractions pour différents cadres d'exploitation forestière par exemple java.util.logging, log4j et logback, permettant à l'utilisateur final de brancher le cadre de journalisation souhaité au déploiement heure. Commons Logging est connu pour souffrir de problèmes de chargeur de classe, ce que SLF4J essaie de résoudre (SLF4J est connu pour être une bibliothèque plus propre). Cela dit, Spring utilise Jakarta Commons Logging API (voir Logging Dependencies in Spring): Spring est compilé avec JCL et Spring rend les objets JCL Log disponibles pour les classes qui s'étendent à Spring. C'est en fait la seule dépendance externe 10 au printemps.Ce choix has been made car beaucoup d'autres frameworks l'utilisent également (par exemple Struts). L'idée était d'éviter d'avoir plusieurs bibliothèques de façades sur le chemin de la classe lors de la construction des applications ("A" pour le printemps, "B" pour Struts, etc.). Il est cependant possible pour remplacer JCL par SLF4J si vous le souhaitez (SFL4J fournit des liaisons aux frameworks de journalisation mais aussi un pont "JCL to SLF4J"). Voir l'article mentionné Logging Dependencies in Spring pour tous les détails.

  • Comment configurer la journalisation pour le printemps. Que fait le fichier web.xml, ai-je besoin d'un fichier log4j.properties ou d'un fichier log4j.xml? Où ça va, dans WEB-INF? Est-ce que quelque chose va dans mon fichier applicationContext.xml? (désolé mais je dois partir de zéro ici).

Pour vous connecter, vous devez 1. décider la mise en œuvre que vous souhaitez utiliser (java.util.logging, log4j ou logback), 2. de mettre celle choisie sur le chemin de classe si nécessaire (java. util.logging est en Java SE donc il ne nécessite pas de bibliothèques supplémentaires) et 3. pour le configurer (en mettant un fichier de configuration sur le classpath). Si vous choisissez d'utiliser log4j, ajoutez simplement son jar et un log4j.properties ou un log4j.xml plus fantaisiste (mais plus détaillé) (c'est juste un autre format pour la configuration) au classpath.

  • J'utilise Hibernate dans mon projet et y compris via Maven. Il semble que Hibernate utilise slf4j-simple. J'ai vu des avertissements disant que je ne peux pas avoir slf4j-simple et slf4j-log4j tous les deux sur le classpath. Je n'ai pas inclus slf4j-log4j en tant que dépendance, mais Hibernate doit l'inclure. Comment puis-je résoudre ce problème? Puis-je forcer Hibernate à utiliser log4j à la place?

Hibernate utilizes Simple Logging Facade for Java (SLF4J) et, en effet, vous ne pouvez pas avoir plusieurs bindings (par exemple slf4j-simple.jar et slf4j-logj12.jar) sur le chemin de classe en même temps. Ici, vous obtiendrez probablement slf4j-simple.jar transitoirement d'une autre dépendance. Pour résoudre ce problème, exécutez mvn dependency:tree pour déterminer d'où il provient et excluez-le si nécessaire. Et en passant, dans votre cas, je voudrais configurer Spring pour utiliser SLF4J comme Hibernate l'utilise. Suivez les étapes dans le lien mentionné dans le premier paragraphe pour cela. Et j'utiliserais logback comme cadre de journalisation (que le successeur de log4j), c'est où les choses se passent maintenant.

0

J'ai eu des problèmes dans la même zone lors de mes tests. J'ai finalement remarqué que junit apportait slf4j-nop comme une dépendance, en plus de la slf4j-log4j12 que je voulais. Une fois que j'ai exclu slf4j-nop, il a commencé à fonctionner.

Questions connexes