2010-05-04 3 views
7

Il n'y a qu'un seul fichier. Et il est écrit simultanément lorsque des copies d'applications Web sont exécutées.Comment différencier les sessions log4j dans un fichier journal des copies de la même application Web?

Comment filtrer uniquement les messages d'un journal de session provenant d'autres lignes de journal?

+0

en utilisant quel conteneur? – skaffman

+0

Je ne suis pas certain d'avoir compris votre question. Vous voulez un fichier (journal) par session Web? – bert

+0

@skaffman Tomcat 6. @bert Tout est écrit dans un fichier, à partir de toutes les sessions. Je veux entendre différentes approches sur la façon de gérer cela. – EugeneP

Répondre

12

L'utilisation d'un filtre de servlet avec des informations NDC ou MDC est le meilleur moyen que j'ai vu. Une comparaison rapide des deux est disponible au http://wiki.apache.org/logging-log4j/NDCvsMDC. J'ai trouvé que MDC a mieux fonctionné pour moi par le passé. N'oubliez pas que vous devez mettre à jour votre fichier de propriétés log4j pour inclure la version que vous préférez (définitions de modèle au http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html).

Un exemple complet de configuration de MDC avec un filtre de servlet est disponible au http://veerasundar.com/blog/2009/11/log4j-mdc-mapped-diagnostic-context-example-code/. Un peu plus facile à configurer, mais une option nettement inférieure: vous pouvez choisir d'imprimer simplement l'ID de thread (via le fichier de propriétés) pour chaque requête et vous assurer que la première chose que vous consignez à chaque requête est un identifiant de session . Ce n'est pas aussi approprié (ou utile), mais il peut fonctionner pour les applications à faible volume.

5

Vous pouvez définir un message contextuel comprenant l'identifiant de l'instance d'application spécifique en utilisant org.apache.log4j.NDC, comme ceci:

String appInstanceId = "My App Instance 1"; 
org.apache.log4j.NDC.push(appInstanceId); 
// handle request 
org.apache.log4j.NDC.clear(); 

Vous pouvez configurer le contexte lors de l'initialisation de votre application Web par exemple, ou à l'intérieur du doPost() méthode de vos servlets. Comme son nom l'indique, vous pouvez également imbriquer des contextes dans des contextes avec plusieurs appels push à différents niveaux. Voir la section "Contextes de diagnostic imbriqués" dans la section Log4J manual.

2

Voici une page qui met en place un filtre pour MDC web-app ->http://rtner.de/software/MDCUserServletFilter.html

Être un filtre de servlet, il vous libérera de la gestion MDC/NDC dans chacun de vos servlets.

Bien sûr, vous devez le modifier pour enregistrer des informations plus pertinentes pour votre application Web.

1

Si vous souhaitez différencier des sessions dans la même application, le MDC est le chemin à parcourir. Mais si vous voulez différencier les applications Web qui écrivent dans le même fichier, MDC ne vous aidera pas, car cela fonctionne sur une base de threads. Dans ce cas, j'avais l'habitude de créer mon propre appender qui sait quelle instance d'application il sert. Cela peut être fait à travers les propriétés de configuration de l'appender. Un tel appender collera le nom de l'application dans chaque événement de journalisation en tant que propriété avant de l'écrire dans le média, et vous pourrez ensuite utiliser une mise en page pour afficher cette valeur de propriété dans le fichier texte dans lequel elle est écrite. Utiliser MDC dans un tel cas ne fonctionnera pas parce que chaque thread devra MDC.put (applicationName) et c'est assez moche. MDC est seulement bon pour un seul processus, pas pour plusieurs processus. Si quelqu'un connaît le contraire, j'aimerais l'entendre.

Questions connexes