J'étais sur un projet où je devais gérer des dizaines d'applications Web. Chacune des applications se connectait légèrement différemment et c'était une grosse peine à gérer. J'ai utilisé une stratégie similaire à celle que vous décrivez pour standardiser sur log4j et cela a plutôt bien fonctionné.
Fondamentalement, j'ai créé un common.jar unique qui contient du code partagé. Ce fichier contient un fichier log4j.xml qui définit le niveau de journalisation sur INFO et définit l'appender par défaut sur stdout pour common.jar. Cette configuration log4j est utilisée comme référence pour toutes les autres applications.
Pour cet exemple, faire semblant cette classe est à l'intérieur common.jar:
public class ThirdPartyLib
{
protected static final Logger log = LogManager.getLogger("third-party-lib");
public void doSomething()
{
log.debug("Third Party App is about to Do something!");
log.info("Third Party App just did something");
}
}
Maintenant, toutes les autres applications Web peuvent simplement dépendre common.jar. Par exemple, faire semblant cette classe est à l'intérieur myapp.war:
public class MyApp
{
public void CallThirdParty()
{
ThirdPartyLib lib = new ThirdPartyLib();
lib.doSomething();
}
}
Depuis log4j.xml est à l'intérieur common.jar, ce code enregistrera quelque chose comme ça. En d'autres termes, il n'y a pas besoin de mettre à l'intérieur log4j.xml myapp.war:
2011-01-03 15:49:22,451 [main] INFO third-party-lib - Third Party App just did something
Maintenant, si vous voulez/besoin de contrôler l'exploitation forestière dans myapp.war, puis placez simplement un log4j.xml intérieur myapp.war et remplacer les paramètres de common.jar. Par exemple, vous pouvez définir le niveau DEBUG, et vous verrez:
2011-01-03 16:03:22,928 [main] DEBUG third-party-lib - Third Party App is about to Do something!
2011-01-03 16:03:22,928 [main] INFO third-party-lib - Third Party App just did something
MISE À JOUR - Est-il possible de configurer chaque webapp pour se connecter au fichier séparé?
Oui, définitivement. Par exemple, vous pouvez diriger les journaux vers un RollingFileAppender au lieu de stdout à l'intérieur de log4j.xml pour myapp.war. C'est pratique parce que vous pouvez avoir chaque journal webapp individuel dans son propre fichier séparé. En outre, j'ai écrit un filtre de servlet (semblable à ce que le gigadot a suggéré) qui configure log4j pour vérifier si un fichier log4j.xml existe sur un chemin externe (en dehors de la guerre de chaque webapp). De cette façon, les fichiers log4j.xml sont accessibles en dehors des guerres et nous sommes en mesure de définir les niveaux de journalisation sans redémarrer le conteneur de servlet (tomcat, dans ce cas). Si le fichier log4j.xml externe n'existe pas, il utilise par défaut le fichier log4j.xml sur chaque chemin de classe d'applications.
C'est dans le sens de ce que je pensais, cependant, pour compliquer davantage les choses, chaque application web a un appender qui se connecte à un fichier différent basé sur la webapp. Si je réduis mes configurations de projet individuelles à ces seules informations, va-t-il remplacer ou remplacer la configuration de ThirdPartyLib? – Casey
Hey Casey, toutes les configs à l'intérieur de log4j.xml dans chaque application individuelle remplaceront les choses à l'intérieur de log4j.xml à l'intérieur du common.jar. Par conséquent, l'ajout d'un appender dans le fichier log4j.xml de chaque application devrait fonctionner correctement. J'ai mis à jour ma réponse avec plus d'infos. En espérant que ça aide, bonne chance! – Upgradingdave
Merci, aussi la remarque sur les stocker en dehors des guerres que je trouve intéressant car j'ai rencontré ce problème, ayant besoin de déboguer quelque chose en production mais ne voulant pas laisser le niveau de journalisation en débogage etc. mettre à jour un seul fichier serait génial. – Casey