Problème lors de l'installation de Commons Logging / Log4j dans l'application Web Spring avec tomcat 6

StackOverflow https://stackoverflow.com/questions/217929

  •  03-07-2019
  •  | 
  •  

Question

J'ai un problème de configuration de la journalisation dans une application Web apring déployée sous tomcat 6.

La Webapp utilise l’API commons-logging; lors de l’exécution, log4j doit être utilisé. Le fichier journal est créé mais reste vide - aucune entrée de journal ne se produit.

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 ne s’affiche. Les journaux d’informations sont sur la console tomcat, mais pas avec le modèle de présentation configuré.

Les commons-logging-1.1.1.jar et log4j-1.2.14.jar sont inclus dans WEB-INF / lib. Avez-vous une idée de ce qui ne va pas ici?

Était-ce utile?

La solution

Il existe de nombreuses instances documentées sur le Web qui avertissent les utilisateurs de l'utilisation de la journalisation commune. À tel point que ce SLF4J gagne en popularité.

Etant donné que vous n'êtes pas intéressé par l'utilisation de Tomcat avec Log4j, vous devez simplement utiliser Log4j directement dans votre application. Surtout s'il n'y a aucune chance que vous changiez de framework de journalisation à l'avenir. Cela réduira la complexité de votre application et résoudra tous les problèmes de chargeur de classes que vous rencontrez avec la journalisation commune.

Cela devrait être une recherche relativement facile et le remplacer dans votre texte, car commons-logging et log4j utilisent tous deux une structure d'appel similaire pour leurs méthodes de journalisation.

Autres conseils

Veillez particulièrement à ce que pas le fichier log4j.jar n'ait été placé 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 applications Web tenteront également d’utiliser log4j.

Si vous devez utiliser log4j pour la journalisation Tomcat courante, veillez à ce que vos applications Web ne tentent pas de charger log4j également. Si vous avez plusieurs applications Web sur le serveur, vous devrez alors préciser que l’initialisation du journal de chaque application ne nuit pas à l’initialisation des autres applications. Chaque application Web devra utiliser des identifiants de journalisation uniques, qui peuvent être définis avec des noms de package uniques.

L'utilisation d'un log4j commun dans Tomcat avec plusieurs applications Web provoque de graves conflits lorsque vous avez des bibliothèques partagées qui souhaitent toutes se connecter, telles que Hibernate ou Spring. La prochaine application Web qui tente d'initialiser log4j peut fermer le consignateur de la précédente. Cela peut être un gâchis.

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

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

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

Les instructions de construction ici http://tomcat.apache.org/tomcat- 6.0-doc / building.html

Ensuite, remplacez le fichier tomcat-juli.jar dans le répertoire / bin de Tomcat et placez le fichier tomcat-juli-adapters.jar dans le répertoire / lib avec log4j et config.

si vous utilisez la journalisation log4j + common, vous pouvez éviter la plupart des configurations ci-dessus. Journalisation commune LogFactory possède une fonctionnalité de découverte similaire à JAXP, dans la priorité suivante, la recherche d'implémentations de journalisation,    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 le chemin Log4J est disponible dans chemin de classe, utilisez la classe d'encapsuleur correspondante (Log4JLogger).    4. Jdk14Logger    5. SimpleLog

assurez-vous simplement que common-logging.jar et common-logging-api.jar et log4j.jar se trouvent sur le chemin d'accès aux classes.

Peut-être que je me trompe. Essayez ce qui suit:

A) Ajouter un appender à my.package en tant que:                     OU B) Réduire le niveau de journalisation de la racine à INFO

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top