2010-11-23 50 views
7

J'ai beaucoup d'applications Web à construire/paquet, et je voudrais partager leurs bibliothèques communes.Comment emballer webapp lors de l'utilisation de slf4j/logback?

En ce qui concerne l'exploitation forestière, je voudrais regrouper slf4j-api à chaque application, mais envisager la mise en œuvre comme prévu par mon conteneur (qui est actuellement tomcat)

Pour ce faire, je copiais les deux pots, logback- classique et logback-core dans le répertoire $ CATALINA \ lib.

Malheureusement, lors de l'exécution, la liaison entre slf4j et sa mise en œuvre échoue avec le message d'erreur suivant:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 

La seule façon que je réussi à le faire fonctionner est quand regrouper le pot dans les fichiers de guerre.

Des idées?

Répondre

8

Cela ne fonctionnera pas comme prévu. Les cadres de journalisation utilisent beaucoup de variables statiques (variables globales a.k.a.).

Ainsi, chaque fois que vous chargez une configuration de journalisation, elle la remplace pour toutes les applications déployées dans votre conteneur. Ce n'est généralement pas ce que vous voulez.

Intégrez l'implémentation du journal à votre fichier WAR afin que le conteneur Web puisse s'assurer que chaque application Web possède son propre ensemble de variables globales. [EDIT] Si vous voulez vraiment contrôler toutes les applications avec la même configuration de journal, vous devez déplacer toutes les classes de journaux dans le conteneur. Cela comprend slf4j.

Je recommande fortement de mettre la configuration de journal dans un JAR et de le mettre là aussi. Vous pouvez également déployer une seule application Web fictive qui ne contient que le moins de code possible (donc Tomcat le chargera) plus le logback.xml

Sinon, l'ordre de démarrage des applications déterminera ce que la journalisation sera lorsque vous arriverez à un point où la configuration du journal doit changer.

+0

"il va le remplacer pour toutes les applications déployées dans votre conteneur." C'est en fait exactement ce que je veux – David

+1

D'accord ... dans ce cas. vous devez déplacer * toutes * les classes de journalisation (y compris slf4j) dans '$ CATALINA/lib' –

+0

En effet, c'est la façon de le faire Merci – David

1

avez-vous respecté

Placer un (et un seul) de slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar ou logback-classic.jar sur le chemin de la classe devrait résoudre le problème.

?

si vous utilisez par ex. mise en veille prolongée, il pourrait introduire slf4j-log4j12.jar dans votre classpath, donc il pourrait y avoir plus d'une mise en œuvre de slf4j dans votre classpath

pour moi, il travaille avec slf4j et log4j

+0

oui, j'ai respecté cela. – David

0

Nous mettons tout pot pour SLF4J & Logback en shared/lib de Tomcat. Ensuite, nous mettons un fichier journal global dans les classes partagées.

Mais je ne sais toujours pas si c'est une bonne pratique. Nous devons gérer un journal par utilisateur, nous avons donc configuré MDC afin d'utiliser SiftingAppender. J'ai une question qui attend une réponse à ce sujet :(