2009-11-25 2 views
2

Veuillez vous référer à: How to enable IP address logging with Log4Net qui explique comment enregistrer une adresse IP à l'aide de log4net.Log4Net journalisation de l'adresse IP d'une seule session sur plusieurs threads

Mon problème est que dans certains cas, des threads supplémentaires sont générés qui appartiennent à une session. Maintenant, j'ai besoin de log4net pour comprendre (ou le thread) pour pouvoir se connecter avec l'adresse IP correcte.

Actuellement, lorsqu'un thread supplémentaire est généré, le thread se connecte au fichier journal sous la forme (null) au lieu d'une adresse IP. Comment puis-je m'assurer que tous les threads liés à une session connaissent l'adresse IP de l'hôte distant? Avoir la session connaître l'adresse IP à laquelle il a affaire.

Répondre

4

La solution était:

public static class MyLogManager 
{ 
    public static ILog GetThreadAwareIPLogger(string loggerid) 
    { 
     if (log4net.ThreadContext.Properties["ip"] == null || !string.IsNullOrEmpty(log4net.ThreadContext.Properties["ip"].ToString())) 
      log4net.ThreadContext.Properties["ip"] = HttpContext.Current.Request.UserHostAddress.PadLeft(15); 

     return LogManager.GetLogger(loggerid); 
    } 
} 

Ceci est juste un début de la solution. Le but est de créer une nouvelle fabrique de Loggers sensibles aux threads/sessions, en utilisant la classe (sinon) scellée dans votre propre classe statique publique.

Je reçois une instance de log4net ILog qui sait à partir de quelle session il a été créé/engendré et définit automatiquement l'adresse IP dans le ThreadContext du thread lorsque vous demandez un nouveau logger. J'espère que cela aide quelqu'un d'autre :-)

2
  1. Lorsqu'un nouveau thread est créé pour cette session, indiquez-lui l'adresse IP, soit dans le constructeur, soit via un setter, avant de le lancer.
  2. Avoir le thread mettre cette information dans ThreadContext.Properties quand il commence à courir.

Vous devrez peut-être modifier légèrement ceci si vous utilisez un pool de threads, mais le principe de base serait le même.

Questions connexes