2010-11-04 3 views
3

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, de toute façon pour éviter les conflits de journalisation log4j dans l'environnement Web

Cela semble causer des problèmes avec log4j. Différentes applications Web peuvent avoir des configurations log4j différentes, mais la consignation se déplace vers le même fichier. En lisant en ligne, il semble que log4j utilise beaucoup les singletons, en termes d'appenders et d'autres fonctionnalités.

Existe-t-il un moyen de séparer complètement les configurations log4j d'une application web de l'autre?

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 

En ce moment, la connexion de webapp2 peut apparaître dans les journaux de webapp1 et vice versa. Nous ne le voulons pas.

Solution possible:

  • Il est peut-être possible d'ajouter un fichier personnalisé appender? Cela réglerait-il le problème et quel code ajouterais-je à l'appender personnalisé?

  • Est-il possible de changer l'initialisation de log4j? Par exemple, pourrais-je utiliser une servlet de démarrage pour charger logj4 pour chaque application web.

+0

Ce n'est pas clair sur ce que vous voulez vraiment. Voulez-vous que plusieurs applications Web déployées sur le même serveur se connectent au même fichier? – Qwerky

+0

Désolé, j'ai mis à jour mon message. Les journaux de webapp1 apparaîtront dans les journaux webapp2. Et je ne veux pas ça. Je suppose en raison de la nature singleton de log4j. –

Répondre

2

Vous avez deux façons de résoudre votre problème:

  1. Configurer votre application. serveur de sorte qu'il ne partage pas les chargeurs de classe à travers plusieurs webapps. Quand c'est le cas, en raison de la nature de log4j, un seul fichier log4j.properties sera chargé.

  2. Si vous quittez l'application. serveur afin qu'il partage des chargeurs de classe, puis utilisez un fichier "master" log4j.properties. Dans ce document, définir appenders pour la racine de chacune de vos applications (exemple com.mycompany.webapp1, com.mycompany.webapp2)

Aucune solution est parfaite. En particulier, le second sera problématique si vos applications Web partagent des classes qui utilisent log4j. Dans ce cas, les journaux des deux applications se retrouveront dans le même fichier.

Votre problème est commun. Pour en savoir plus sur ce sujet, allez sur "log4j and j2ee".

Edit: puisque les solutions 1 et 2 ne sont pas réalisables, vous pouvez essayer quelque chose d'autre:

  • Utilisation du fichier log4j.properties par application. Dans chacun d'entre eux, définissez un appender pour leur racine (comme expliqué dans la solution 2), et définissez l'additivité sur false. Cela ne sera pas parfait s'il y a un partage de classe entre eux.

  • Configurer log4j par programme pour chaque application.Comme ce sont des applications héritées, cela pourrait être difficile. Une façon de le faire est d'utiliser ServletContextListener pour chaque application et de configurer log4j au démarrage de l'application. Je n'ai pas personnellement essayé cela, donc je ne suis pas sûr à 100% s'il y aura des conflits dus aux chargeurs de classe partagés.

Log4j ne sera plus mis à jour. Ceki Gülcü, qui a créé log4j, a déclaré qu'il concentrera ses efforts sur slf4j et logback, pour corriger certaines erreurs qu'il a commises lors du développement de log4j.

+0

1 ou 2 ne fonctionnera pas vraiment. La configuration du serveur d'applications est définie dans la pierre. Le maître log4j est OK, mais ensuite je dois reconfigurer la configuration pour toutes les applications. Il y a 5 mais ils sont hérités. Les gens de log4j n'ont vraiment pas réparé ça? –

+0

L'application Web fait-elle partie de la même application ou de différentes applications J2EE. WAS vous permet d'avoir un chargeur de classe par application. – Manglu

+0

Ils font partie de la même EAR (Enterprise Application) mais je ne veux pas avoir de chargeur de classe différent en raison de problèmes de session partagés. J'essayais de voir s'il y avait un paramètre de configuration ou de code dans log4j que je pourrais utiliser. –