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] Comment ajouter une expression java dans les logs


Sujet :

Logging Java

  1. #1
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Octobre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Octobre 2004
    Messages : 56
    Points : 66
    Points
    66
    Par défaut [LOG4J] Comment ajouter une expression java dans les logs
    Bonjour,

    Je souhaite passer l'information sur le user authentifié via le realm de tomcat, ( que l'on recupere donc avec webContext.getHttpServletRequest().getUserPrincipal().getName(); ) dans le genre :


    2010-06-09 17:10:56,121 INFO http-8084-Processor24 blalblalbnal - USER : test

    J'ai deja pas mal cherché en vain (mal peut etre (faut dire on est lundi)) si vous avez une idée..

    j'imagine que ça se fait avec PatternLayout mais pour le conversionPattern je bloque un peu.
    Il s'agirait de pouvoir mettre un expression java dans le conversionPattern


    j'ai pensé à faire un extend d'une classe de log4j, mais je ne vois pas trop laquelle etendre..

    merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par p@radox Voir le message
    j'imagine que ça se fait avec PatternLayout mais pour le conversionPattern je bloque un peu.
    Il s'agirait de pouvoir mettre un expression java dans le conversionPattern
    Ça risque pas, Log4j va le récupérer d'où, le webContext ?

    Par ailleurs, utiliser une expression Java, ça veut dire avoir la possibilité de compiler et charger une classe Java générée pour utiliser cette expression. Pas infaisable, mais ça impose pas mal de contraintes pour du bête logging.

    Le plus simple, je pense, est d'utiliser le MDC, en plaçant le username dans le MDC chaque fois que tu reçois une request qui a un username.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Octobre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Octobre 2004
    Messages : 56
    Points : 66
    Points
    66
    Par défaut
    ok merci de ton aide, je vais regarder de ce coté (MDC )

    +

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par p@radox Voir le message
    Bonjour,

    Je souhaite passer l'information sur le user authentifié via le realm de tomcat, ( que l'on recupere donc avec webContext.getHttpServletRequest().getUserPrincipal().getName(); ) dans le genre :


    2010-06-09 17:10:56,121 INFO http-8084-Processor24 blalblalbnal - USER : test

    J'ai deja pas mal cherché en vain (mal peut etre (faut dire on est lundi)) si vous avez une idée..

    j'imagine que ça se fait avec PatternLayout mais pour le conversionPattern je bloque un peu.
    Il s'agirait de pouvoir mettre un expression java dans le conversionPattern


    j'ai pensé à faire un extend d'une classe de log4j, mais je ne vois pas trop laquelle etendre..

    merci
    Nous l'avons fait pour avoir le nom de l'user authentifié via Spring Security et grâce à SecurityContextHolder cela fonctionne très bien, et évidemment pas avec des expressions Java : un simple %U a suffi…

    Mais pour obtenir le webContext ou la servletRequest sans modifier tous vos points d'entrée de servlet, il n'y a que le pattern "worm hole" d'AspectJ qui vous permettra de le faire…
    mais si vous n'utilisez pas encore AspectJ dans votre projet, c'est sera peu lourd à mettre en œuvre rien que pour çà, et si vous n'avez jamais utilisé AspectJ : le pattern "worm hole" n'est pas le plus simple pour débuter…

    (c'est l'aspect qui ajoutera le nom de l'utilisateur au texte retourné par PatternConverter.convert(LoggingEvent event)…)

    Le principe du "worm hole" est le suivant :
    on capture un contexte d'exécution d'une méthode et on le transmet directement à une routine appelée plus bas dans l'arbre des appels sans devoir ajouter un paramètre à toutes les méthodes intermédiaires dans l'arbre des appels…

    un poincut capture le contexte de l'appelant (ici vous capturez sur le point d'entrée de la servlet et par exemple la servletRequest)
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pointcut callerSpace(HttpServletRequest request) : execution(* *.*(HttpServletRequest, HttpServletResponse)) && args(request, response) ;
    mais ce pointcut dépendra du type d'implémentation de vos controllers…

    un pointcut capture l'exécution de l'appelé :ici convert(LoggingEvent event)
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pointcut calleeSpace() : execution(String convert(LoggingEvent)) ;
    mais vous pouvez être plus précis quant aux packages à weaver
    Et il faudra quand même que vous implémentez votre propre PatternConverter car AspectJ ne vas pas "weavé" le log4j.jar…

    le dernier pointcut combine les 2 précédents mais en utilisant l'instruction cflow() pour le pointcut du contexte appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pointcut wormhole(HttpServerRequest request) : cflow(callerSpace(request)) && calleeSpace() ;
    l'aspect proprement se fait par un around sur le dernier pointcut avec comme paramètre le contexte capturé : ici la request

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String around(HttpServletRequest request) : wormhole(callerInstance) {
    	return "USER: " + request.getUserPrincipal().getName() + " " + proceed(request) ;
    }

Discussions similaires

  1. Comment ajouter une petite image dans un Trichedit.
    Par Ardely dans le forum Delphi
    Réponses: 30
    Dernier message: 23/03/2007, 16h57
  2. Réponses: 1
    Dernier message: 11/09/2006, 10h14
  3. Réponses: 1
    Dernier message: 26/05/2006, 11h11

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