2009-04-23 17 views
3

Je développe une application Web Java EE qui est exécutée sous JBoss.Comment collecter des logs dans jboss liés à une seule requête?

Je souhaite effectuer les opérations suivantes: Lorsqu'un utilisateur envoie une requête http (en ouvrant une page ou via AJAX), tous les journaux associés à cette demande sont collectés puis enregistrés dans la base de données. Par parenté, je veux dire qu'ils sont connectés pendant le processus de traitement de la demande en cours. La partie la plus difficile est de collecter les journaux associés à une seule requête.

que je recherchais dans cette solution:

JBoss utilise log4j pour l'enregistrement. Lorsque l'application démarre, un écouteur de début enregistre un appendeur log4j qui collecte tous les journaux dans un champ ThreadLocal. À la fin de la demande, les journaux sont extraits du champ et enregistrés dans la base de données.

Mais, il semble maintenant que les appendeurs log4j fonctionnent dans d'autres threads. Cela rend cette solution impossible.

Avez-vous une idée, comment cela a-t-il pu être fait?

Merci, Artem B.

+0

Peut-être que je manque quelque chose, mais ne pouvait pas vous mettre quelques-uns log4j appelle dans les servlets qui sont accessibles par entrant demandes? – AndreiM

+0

Le problème est que la demande est gérée par un certain nombre d'EJB sans état. Au cours du processus de gestion, ils enregistrent tous un tas de choses utiles - c'est ce que je veux collecter à un seul emplacement et ensuite le stocker dans la base de données. – artemb

Répondre

7

Vous pouvez utiliser le log4j MDC class (mappée Contexte de diagnostic) pour associer certaines données avec le thread courant.

J'utilise ce souvent pour ajouter l'ID de session à la sortie du journal pour quelque exploitation forestière va dans pour cette session:

public class AddSessionIdToLogFilter implements Filter { 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, 
      ServletException { 

      if (request instanceof HttpServletRequest) { 
       HttpServletRequest httpRequest = (HttpServletRequest) request; 
       String sessionID = httpRequest.getSession().getId(); 

       MDC.put("SessionID", sessionID); 
      } 

      ... 

Ensuite, vous parlez juste du MDC par clé dans votre PatternLayout. Je ne sais pas comment le appender DB fonctionne, mais je suppose qu'il peut se connecter champs MDC aussi ...

log4j.appender.LOGFILE.layout.ConversionPattern= ... [SessionID=%X{SessionID}] ... 
+0

Je vais essayer ça bientôt et je dirai si ça marche. Merci! – artemb