2010-11-18 20 views
1

Nous avons un environnement web j2ee. Le serveur est configuré pour partager des sessions et éventuellement des chargeurs de classe sur plusieurs applications Web. Fondamentalement, un classloader pourrait server plusieurs applications Web.LOG4J en tant que singleton, fermeture des appenders sur le serveur stop and start (Tentative d'ajout à l'appender fermé)

Cela semble causer des problèmes avec log4j. Différentes applications Web peuvent avoir des configurations log4j différentes, mais la consignation peut s'arrêter dans un fichier.

Nous obtenons l'erreur suivante:

log4j: erreur Tentative d'ajouter à appender nommé fermé [myLogger]

Serveur: websphere6 + Log4j: Java 1.4.2: 1,5

Example log4j.properties (webapp1): 

log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=/usr/local/file1.log 
log4j.additivity.com.app=false 

Example log4j.properties (webapp2): 

log4j.appender.Z=org.apache.log4j.RollingFileAppender 
log4j.appender.Z.File=/usr/local/file2.log 
log4j.additivity.com.app=false 

À l'heure actuelle, la journalisation à partir de webapp2 peut apparaître dans les journaux webapp1 et vice versa. Nous ne le voulons pas.

+0

est-ce pas un doublon complet de http://stackoverflow.com/questions/4098246/log4j-as-a-singleton-anyway-to-avoid-log4j-logging-conflicts-in-web- environnement? – darioo

+0

Non. Je parlais de l'append à fermé appender dans cette question. –

Répondre

0

Log4j ne s'initialise probablement qu'une seule fois et charge aléatoirement l'une ou l'autre des propriétés log4j.properties.

Dans notre cas, nous avons décidé que chaque WebApp devrait avoir un classloader séparé. De cette façon, nous pouvons décider de modifier le niveau de journalisation sur d'autres frameworks tels que Spring ou iBatis, pour chaque WebApp. La meilleure façon de déboguer Classloader (très commun avec WebSphere) est de trouver quel fichier Log4j vous utilisez et quel fichier log4.properties est utilisé.

URL url = Logger.class.getProtectionDomain().getCodeSource().getLocation(); 
System.out.println("Sourcing Log4j from " + url