IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Logging Java Discussion :

[log4j] insérer session id dans les log


Sujet :

Logging Java

  1. #1
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut [log4j] insérer session id dans les log
    Bonjour,

    J'ai développé une application online et j'aimerai faire apparaître l'identifiant de session pour chaque ligne de log.
    Je me demandais donc s'il existait une syntaxe à insérer dans le fichier de configuration de log4j pour le faire ?

    J'ai un fichier de configuration que je charge pour initialiser log4j, dont voici la ligne qui précise le format des logs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    log4j.appender.stdout.layout.ConversionPattern=%d %5p - %F@%m%n
    Est-ce que quelqun connait ce qu'il faut ajouter pour pouvoir afficher le session id d'un utilisateur ? Ou une autre méthode s'il n'en existe pas de similaire ?

    En attendant je vais voir si je ne trouve pas une alternative, mais j'aimerai éviter de devoir faire cet ajout depuis une classe d'action java.

  2. #2
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Re, c'est bon j'ai trouvé la solution.

    Voici une petite classe fort bien sympatique et j'en remercie l'autheur (Matthias Gärtner).

    Le but de l'exercice est d'implémenter un filtre qui viendra ajouter artificiellement - comme une surcouche - certains attributs dans la liste des attributs disponible de log4j a afficher dans les logs. Ca c'est mon explication mais c'est pas terrible, si vous voulez comprendre correctement vous pouvez regarder ici :
    http://rtner.de/software/MDCUserServletFilter.html

    Etape 1 :
    Bref, voici la classe java à inclure dans son projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    package org.*.*.*.gui;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.log4j.MDC;
    
    /**
     * Simple Servlet Filter that sets the Log4J MDC to the currently logged-in user.
     * This filter is intended to be used with JBoss´s http-invoker web application
     * to identify/separate parallel fat client RMI requests.
     *
     * $id: $
     *
     * @author Matthias Gärtner
     *
     */
    public class MDCUserServletFilter implements Filter
    {
        public void init(FilterConfig arg0) throws ServletException
        {
        }
    
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException
        {
            HttpServletRequest httprequest = (HttpServletRequest) request;
    
            boolean bUserAdded = false;
            if (httprequest.getSession(false) != null)
            {
                String sessionId = httprequest.getSession(false).getId();
                if (sessionId != null && sessionId.length() > 0)
                {
                    // Put the principal's name into the message diagnostic
                    // context. May be shown using %X{SESSION_ID} in the layout
                    // pattern.
                    MDC.put("SESSION_ID", httprequest.getSession(false).getId());
                    bUserAdded = true;
                }
            }
    
            try
            {
                // Continue processing the rest of the filter chain.
                chain.doFilter(request, response);
            }
            finally
            {
                if (bUserAdded)
                {
                    // Remove the added element again - only if added.
                    MDC.remove("SESSION_ID");
                }
            }
        }
    
        public void destroy()
        {
        }
    }
    Etape 2 :
    Modifier le fichier web.xml (configuration de l'application web) comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
        
        <!-- Standard Action Servlet Mapping -->
        <servlet-mapping>
            <servlet-name>MyServlet</servlet-name>
            <url-pattern>*.do</url-pattern>
    	</servlet-mapping>
    	
    	<filter>
      		<filter-name>MDCUserServletFilter</filter-name>
     		<filter-class>org.*.*.*.gui.MDCUserServletFilter</filter-class>
    	</filter>
    
    	<filter-mapping>
    		<filter-name>MDCUserServletFilter</filter-name>
      		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    Les lignes en gras sont celles à rajouter pour que le filtre prenne effet au moment de l'initialisation de la servlet.

    Etape 3 (finale) :
    Il ne reste plus qu'à rajouter l'attribut dans le fichier de configuration des logs comme suit (en gras):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    log4j.appender.stdout.layout.ConversionPattern=%d %5p - %X{SESSION_ID} - %F@%m%n
    Voilà, merci bien à l'auteur pour m'avoir sauvé de ce pas

  3. #3
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Petite précision,

    La classe donnée ci-dessus illustre en fait comment utiliser la classe MDC de log4j.

  4. #4
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Re,
    alors il semblerait qu'il y ai quelques erreurs dans l'implémentation que j'ai fait. Quand je lance mes applications online pas de soucis, lorsque j'en fais tourner une via IE pas de soucis lorsque je reste toujours sur la même classe d'action (même forward donc).
    Par contre, dès que je change de forward (action), j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Exception initializing TldLocationsCache: XML parsing error on file /WEB-INF/web.xml: (line 72, col 10): Element type "filter" must be declared.
    Ce qui fait référence à ces lignes dans mon fichier web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	<filter>
      		<filter-name>MDCUserServletFilter</filter-name>
     		<filter-class>org.*.*.*.MDCUserServletFilter</filter-class>
    	</filter>
     
    	<filter-mapping>
    		<filter-name>MDCUserServletFilter</filter-name>
      		<url-pattern>/*</url-pattern>
    	</filter-mapping>

  5. #5
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Re,

    Alors si vous avez la même erreur que moi c'est qu'il faut changer la version de la DTD utilisée pour la validation du fichier web.xml

    Deux choses importantes donc :
    1 - Mauvaise position dans le fichier web.xml.
    En effet plus haut j'avais mis ma déclaration du filter à l'intérieur de l'élément <servlet>, ce qui n'est pas bon.
    Il faut mettre ces déclarations au même niveau que <servlet>, c'est à dire juste en dessous (arbrement parlant ) de la racine <web-app> comme le stipule la DTD en version 2.3 (j'étais en version 2.2 auparavant).

    Voilà ce que donne donc mon fichier web.xml (correct) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    
    	<display-name>* GUI</display-name>
    	<description>* V1.2.4</description>
    	<distributable/>
    	
    	<filter>
      		<filter-name>MDCUserServletFilter</filter-name>
     		<filter-class>org.*.*.*.MDCUserServletFilter</filter-class>
    	</filter>
    
    	<filter-mapping>
    		<filter-name>MDCUserServletFilter</filter-name>
      		<url-pattern>/*</url-pattern>
    	</filter-mapping>
     	
        <!-- Standard Action Servlet Configuration (with debugging) -->
        <servlet>
          ... blablabla...
        </servlet>
    </web-app>

    Voilà, en espérant que ça puisse résoudre le problème d'autres personnes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/03/2011, 16h58
  2. Réponses: 3
    Dernier message: 27/09/2010, 20h16
  3. Ajouter ERROR_ID dans les Log (Log4j)
    Par ralf091 dans le forum Logging
    Réponses: 0
    Dernier message: 27/08/2008, 12h56
  4. probleme insérer session id dans les log
    Par exodius dans le forum Logging
    Réponses: 2
    Dernier message: 01/08/2008, 11h48
  5. [Log4J] Parasites dans les logs
    Par Konrad Florczak dans le forum Logging
    Réponses: 2
    Dernier message: 01/11/2006, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo