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

ASP.NET Discussion :

[Log4Net] Fonctionnement des propriétés : log4net.ThreadContext.Properties["mavariable"]


Sujet :

ASP.NET

  1. #1
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut [Log4Net] Fonctionnement des propriétés : log4net.ThreadContext.Properties["mavariable"]
    Bonjour,

    dans le tutoriel de lutecefalco sur l'introduction de Log4Net, il y a une notion que je n'ai pas compris. Je ne sais pas si c'est le meilleur endroit pour poster mais bon, j'y vais.

    Il y est écrit le texte suivant :

    Pour logger un message, il suffit d'appeler le logger de son choix puis la fonction correspondant au niveau de l'événement.


    Par exemple, pour logger une erreur avec le logger ExceptionLogger, il suffit d'appeler :

    Log.ExceptionLogger.Error(msg) où msg est le message à loguer.


    Pour loguer une info de debug avec le logger MonitoringLogger, il faut appeler :

    Log.MonitoringLogger.Debug(msg) où msg est le message à loguer.


    Pour ajouter une propriété à celles de log4net (comme on a pu le voir pour l'appender ), on utilise la syntaxe suivante:

    log4net.ThreadContext.Properties["log_who"] = user;
    Log.MonitoringLogger.Debug(msg);


    Afin de mettre en pratique tout ça, je vous conseille d'exécuter le site web et d'observer comment les informations sont loggées. Une fois cette étape passée, vous pourrez modifier le fichier de configuration de log4net afin de vous familiariser avec la façon dont fonctionne log4net.
    je m'interroge sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    log4net.ThreadContext.Properties["log_who"] = user;
    Log.MonitoringLogger.Debug(msg);
    Cela veut il dire que je pourrais créer une variable log_Referer par exemple et la stocker pour chacun de mes utilisateurs? ou est ce que log4net.ThreadContext fonctionne comme un variable d'application? En fait je crains les conflit d'utilisation de ma propriété avec plusieurs utilisateurs simultanés...

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Je connais pas du tout log4net, mais le nom ThreadContext me semble assez clair : ça contient des données qui sont spécifiques au thread courant. Comme un thread ne peut traiter qu'une requête à la fois, tu ne risque pas d'avoir de conflit. Si une autre requête est traitée pour un autre utilisateur, ce sera sur un autre thread, et donc avec un autre ThreadContext

  3. #3
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    C'est bien ce que je pensais, mais cela veut dire alors que je suis obligé d'assigner la bonne valeur à ma propriété à chaque tentative de log afin de repérer l'utilisateur courant ou l'IP actuellement utilisée.

    Merci en tout cas de ta réponse,

  4. #4
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    Je poursuis mon developpement en mettant un peu plus de code :

    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
        public static class Log
        {
            public static ILog MonitoringLogger
            {
                get { return LogManager.GetLogger("MonitoringLogger"); }
            }
     
            public static void SetCurrentProperties()
            {
                System.Web.HttpContext context = System.Web.HttpContext.Current;
     
                if (KjuContext.GetCurrentUser().Account.IsAuthenticated)
                    log4net.ThreadContext.Properties["log_who"] = KjuContext.GetCurrentUser().Account.UserName;
                if(!string.IsNullOrEmpty(context.User.Identity.Name))
                    log4net.ThreadContext.Properties["log_who"] = context.User.Identity.Name;
                if (!string.IsNullOrEmpty(context.Request.ServerVariables["REMOTE_ADDR"]))
                    log4net.ThreadContext.Properties["log_IP"] = context.Request.ServerVariables["REMOTE_ADDR"]; 
                if (!string.IsNullOrEmpty(context.Request.ServerVariables["REMOTE_ADDR"]))
                    log4net.ThreadContext.Properties["log_Referer"] = context.Request.ServerVariables["HTTP_REFERER"];
                if (!string.IsNullOrEmpty(context.Request.ServerVariables["REMOTE_ADDR"]))
                    log4net.ThreadContext.Properties["LogsPageURL"] = context.Request.ServerVariables["HTTP_REFERER"];
                if (!string.IsNullOrEmpty(context.Request.Url.ToString()))
                    log4net.ThreadContext.Properties["LogsPageURL"] = context.Request.Url;
            }
        }

    et son utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void HttpTrace(string storedProcedure, string operation)
            {
                string msg;
                // On vérifie que le logger a un niveau de log suffisant
                if (Utility.Log.MonitoringLogger.IsDebugEnabled)
                {
                     msg = string.Format("Stored Procedure: {0}<BR>", storedProcedure);
     
                    Library.Utility.Log.SetCurrentProperties();
     
                    Utility.Log.MonitoringLogger.Debug(msg);
                }
            }
    la question que je me pose est : dois je mettre un lock sur cette étape de logging? que se passe t'il si deux personnes passe dans la fonction au même moment, la première personne ne risque t'elle pas de voir s'attribuer dans le log les données de la deuxième?

    Désolé, j ai toujours été très nul avec ces histoire de thread et de concurrence... merci en tout cas d'avance!

  5. #5
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    Bon je poursuis mon monologue, j'ai trouvé ma solution.

    http://logging.apache.org/log4net/re.../contexts.html

    merci en tout cas,

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/06/2014, 10h53
  2. Fonctionnement des propriétés utilisateur
    Par youtpout978 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 19/11/2011, 12h29

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