2010-05-17 4 views
1

J'ai une application de printemps qui a configuré log4j (via xml) et qui fonctionne sur Tomcat6 qui fonctionnait bien jusqu'à ce que nous ajoutons un tas de dépendances via Maven. À un certain point, toute l'application a commencé à enregistrer une partie de ce qu'elle était censée être déclarée dans le fichier log4.xmlJava journalisation cauchemar et log4j ne se comporte pas comme prévu avec spring + tomcat6

"une petite diatribe ici" Pourquoi la journalisation doit-elle être aussi difficile dans le monde java? pourquoi soudainement une application qui était juste bien commencer à se comporter si bizarre et pourquoi il est si difficile de déboguer?

J'ai lu et essayer de résoudre ce problème pour les jours mais jusqu'à présent, pas de chance, espérons certains experts ici peut me donner quelques idées sur ce

J'ai ajouté l'option de débogage log4j pour vérifier si log4j est en prenant la lecture du fichier de configuration et de ses valeurs, ce qui est quelle partie de celui-ci montre

log4j: Level value for org.springframework.web is [debug]. 
log4j: org.springframework.web level set to DEBUG 
log4j: Retreiving an instance of org.apache.log4j.Logger. 
log4j: Setting [org.compass] additivity to [true]. 
log4j: Level value for org.compass is [debug]. 
log4j: org.compass level set to DEBUG 

Comme vous pouvez le voir debug est activé pour boussole et spring.web, mais il ne montre que le niveau « INFO » pour les deux paquets. Mon log4j fichier de configuration n'a rien d'extraordinaire juste une ConsoleAppender plaine

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

<!-- Appenders --> 
<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%-5p: %c - %m%n" /> 
    </layout> 
</appender> 

Quel est le truc pour faire ce travail? Qu'est-ce que c'est que mon malentendu ici? Est-ce que quelqu'un peut me diriger dans la bonne direction et expliquer comment je peux rendre ce bûcheron plus résistant à la balle?

+0

La journalisation fonctionne-t-elle à nouveau lorsque vous supprimez ces dépendances? Juste essayer d'affiner le problème ... – FelixM

Répondre

3

Ce n'est peut-être pas log4j qui effectue la journalisation, et donc votre configuration log4j serait ignorée. Journaux de printemps utilisant Commons Logging, qui est une API qui peut déléguer à divers cadres de journalisation, y compris log4j. Pour décider quelle implémentation utiliser, la journalisation des communs se penche sur le classpath.

Si vous avez ajouté une dépendance qui a déplacé sa propre implémentation de consignation dans le chemin de classe, la consignation des ressources peut maintenant utiliser l'autre implémentation.

Je recommande de définir un point d'arrêt lors d'un appel à la fonction de journalisation et de suivre l'exécution pour voir quelle implémentation de journalisation est utilisée.

+0

Merci beaucoup meriton, en effet il y avait une autre implémentation sur place, en fait c'était "slf4j-simple" qui a le niveau debug désactivé par défaut. Après le changer à "slf4j-log4j12" il commence à se connecter basé sur le prefs ensemble à log4j.xml – maverick

1

Comme cela fonctionnait jusqu'à ce que vous chargiez un certain nombre de dépendances via Maven, peut-être une configuration Log4j est-elle chargée par inadvertance via ces dépendances?

Exécutez mvn dependency:tree pour voir ce qui est en cours de chargement, puis vérifiez si l'une de ces dépendances possède une configuration Log4j.

+0

merci pour l'essai, mais les informations de débogage log4 montre qu'il utilise mon fichier de configuration pas d'autre log4j: Utilisation de l'URL [fichier: /home/xxxxxx/comp/.metadata/. plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/app1/WEB-INF/classes/log4j.xml] pour la configuration log4j automatique. log4j: – maverick

0

Je pense que votre problème est que vous ne définissez pas le paramètre threshold sur vos appenders, et (peut-être) parce que vous n'attribuez pas ces appenders à vos enregistreurs.

Essayez d'ajouter param name="threshold" value="debug" à vos appenders puis les ajouter explicitement au particulier (ou racine) enregistreurs comme ceci:

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="threshold" value="debug" /> 
    <param name="Target" value="System.out" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%-5p: %c - %m%n" /> 
    </layout> 
</appender> 

<logger name="org.springframework.web"> 
    <level value="debug" /> 
    <appender-ref ref="console" /> 
</logger> 

Aussi, this page dit « Ce appender n'enregistre pas les messages avec moins prioritaire que la un spécifié ici même si la priorité de la catégorie est inférieure », ce qui est probablement la source de votre problème.

+0

Merci pour l'astuce sur le seuil et le niveau par appender, très utile – maverick

0

Cela semble être un bon fil pour vous de lire: http://forum.springsource.org/showthread.php?t=88250

coupe à la chasse, il semble que l'affiche avait un problème avec un paramètre de sécurité Tomcat.Un fichier de stratégie Tomcat mis à jour a corrigé le problème.

Probablement quelque chose à faire avec la lecture en dehors de la webapp pour votre fichier log4j.xml.

+0

Merci pour l'info, même si ce n'est pas mon cas, il est important d'avoir cela clair. – maverick

Questions connexes