2008-10-20 13 views
15

J'ai un problème wih une configuration d'enregistrement dans une webapp apring déployée sous tomcat 6.Problème avec la configuration Commons Logging/Log4j WebApp printemps avec tomcat 6

Le webapp utilise le api commons-logging, sur l'exécution log4j devrait être utilisé. Le fichier journal est créé mais reste vide - aucune entrée de journal n'a lieu.

la configuration est la suivante:

WEB-INF/web.xml:

<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>/WEB-INF/log4j.xml</param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

WEB-INF/classes/commons-logging.properties:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger 

WEB- INF/log4j.xml:

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

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    ... 
    </appender> 
    <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 
    <param name="File" value="${catalina.home}/logs/my.log"/> 
    ... 
    </appender> 

    <logger name="my.package"> 
    <level value="INFO"/> 
    </logger> 

    <root> 
    <level value="ERROR"/> 
    <appender-ref ref="CONSOLE"/> 
    <appender-ref ref="FILE"/> 
    </root> 
</log4j:configuration> 

Le fichier logs/my.log est créé, mais aucun journal n'apparaît. Ce sont des journaux d'informations sur la console Tomcat, mais pas avec le modèle de disposition configuré.

Les fichiers communs-logging-1.1.1.jar et log4j-1.2.14.jar sont inclus dans WEB-INF/lib. Une idée de ce qui ne va pas ici?

Répondre

10

Il existe de nombreuses instances documentées sur le Web avertissant les utilisateurs de l'utilisation de la consignation des journaux. Tellement tellement, que SLF4J gagne beaucoup de popularité. Considérant que vous ne souhaitez pas utiliser Tomcat avec Log4j, vous devez simplement utiliser Log4j directement dans votre application. Surtout s'il n'y a aucune chance que vous changiez de cadre de journalisation à l'avenir. Cela réduira la complexité de votre application et éliminera tous les problèmes de chargeur de classe que vous rencontrez avec la consignation des ressources. Ceci devrait être une recherche et un remplacement relativement faciles dans votre texte, car log-logging et log4j utilisent une structure d'appel similaire pour leurs méthodes de journalisation.

+1

Je pense que l'enregistrement des communs (depuis 1.1, là où les bogues entraînant des fuites de mémoire avant) est correct. Mais peut-être est-ce la meilleure solution juste pour utiliser directement log4j - en laissant les bibliothèques utilisant la journalisation des communs non-reconnues. –

+0

Tout cela a fonctionné dans Tomcat 5.5 - parfois les choses se détériorent –

+1

Nope, la consignation des journaux est encore corrompue (2010), utilisez slf4j. http://articles.qos.ch/thinkAgain.html – Manius

1

Vous devez compiler le composant supplémentaire pour la journalisation complète des communs. Par défaut, Tomcat 6 utilise une implémentation codée en dur de la consignation journal qui délègue toujours à java.util.logging.

instructions du bâtiment ici http://tomcat.apache.org/tomcat-6.0-doc/building.html

remplacent alors le tomcat-juli.jar dans le répertoire/bin de Tomcat et placez-le tomcat-juli-adapters.jar dans le répertoire/lib avec log4j et config.

+0

Je ne wont pas le tomcat lui-même de se connecter avec log4j, juste mon webapp. Ou y a-t-il un bug de chargement de classe de tomcat ne permettant pas de fournir mes propres logs de connexion? –

+0

Si Tomcat a les classes Commons Logging dans son chemin d'accès lib, cela sera chargé avant que les fichiers JAR dans WEB-INF/lib soient chargés. –

+0

Le problème est la conception du classloader dans Tomcat 6 (Common ne devrait pas avoir System comme parent). –

5

Veillez particulièrement à ce que vous ayez et non placé log4j.jar dans le répertoire Tomcat commons/lib. Si le chargeur de classe racine charge les bibliothèques log4j, vous rencontrerez des conflits et des problèmes d'initialisation lorsque vos webapps essaieront également d'utiliser log4j.

Si vous avez besoin d'utiliser log4j pour la journalisation courante de Tomcat, vous devez faire attention à ce que vos webapps ne tentent pas de charger aussi log4j. Si vous avez plusieurs webapps sur le serveur, vous aurez besoin de discipline que l'initialisation du journal de chaque webapp ne piétine pas sur l'initialisation des autres webapps. Chaque application Web devra utiliser des ID de journal uniques, ce qui peut être accompli avec des noms de paquets uniques. L'utilisation d'un log4j commun dans Tomcat avec plusieurs applications web provoque des conflits sérieux lorsque vous avez des bibliothèques partagées qui veulent toutes se connecter, telles que Hibernate ou Spring. La prochaine application Web qui tente d'initialiser log4j peut fermer le journal de la précédente.Ça peut être un gâchis.

-1

Peut-être que je me trompe. S'il vous plaît essayez ce qui suit:

A) Ajouter appender à my.package comme: OU B) Réduire le journal leve de racine INFO

+0

Ce n'est pas aussi facile, je sais config log4j. –

0

si vous utilisez log4j + journalisation commune, vous pouvez éviter la plupart des configurations ci-dessus. la journalisation commune LogFactory a une fonction de découverte similaire à JAXP, suivant la priorité, recherchant les implémentations de Log, 1. attribut de configuration org.apache.commons.logging.Log dans le fichier commons-logging.properties 2. propriété système org.apache. commons.logging.Log 3. Si Log4J est disponible dans le chemin d'accès aux classes, utilisez la classe wrapper correspondante (Log4JLogger). 4. Jdk14Logger 5. SimpleLog

assurez-vous juste, à la fois commune-logging.jar et l'exploitation forestière commune-api.jar et log4j.jar à classpath.

3

J'ai eu un problème similaire et j'ai trouvé un correctif maintenant. Démarrer tomcat avec paramètre supplémentaire:

-Dorg.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.LogFactoryImpl

+0

A travaillé pour moi !! Je vous remercie ! Été bloqué sur cela pendant 1 semaine: P –

+0

Vous avez combattu pendant des jours - merci! – Marplesoft

Questions connexes