Comment enregistrer le contexte correct avec les threads Threadpool en utilisant log4net?
Je suis en train d'essayer de trouver un moyen pour se connecter contexte utile à partir d'un tas de fils. Le problème est que beaucoup de code est traité sur les Événements qui sont arrivés par pool de threads les threads (pour autant que je puisse dire) de sorte que leurs noms ne sont pas en relation avec n'importe quel contexte. Le problème peut être démontré avec le code suivant:
class Program
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
static void Main(string[] args)
{
new Thread(TestThis).Start("ThreadA");
new Thread(TestThis).Start("ThreadB");
Console.ReadLine();
}
private static void TestThis(object name)
{
var nameStr = (string)name;
Thread.CurrentThread.Name = nameStr;
log4net.ThreadContext.Properties["ThreadContext"] = nameStr;
log4net.LogicalThreadContext.Properties["LogicalThreadContext"] = nameStr;
log.Debug("From Thread itself");
ThreadPool.QueueUserWorkItem(x => log.Debug("From threadpool Thread: " + nameStr));
}
}
La Conversion motif:
%date [%thread] %-5level %logger [%property] - %message%newline
La sortie est de la sorte:
2010-05-21 15:08:02,357 [ThreadA] DEBUG LogicalContextTest.Program [{LogicalThreadContext=ThreadA, log4net:HostName=xxx, ThreadContext=ThreadA}] - From Thread itself
2010-05-21 15:08:02,357 [ThreadB] DEBUG LogicalContextTest.Program [{LogicalThreadContext=ThreadB, log4net:HostName=xxx, ThreadContext=ThreadB}] - From Thread itself
2010-05-21 15:08:02,404 [7] DEBUG LogicalContextTest.Program [{log4net:HostName=xxx}] - From threadpool Thread: ThreadA
2010-05-21 15:08:02,420 [16] DEBUG LogicalContextTest.Program [{log4net:HostName=xxx}] - From threadpool Thread: ThreadB
Comme vous pouvez le voir les deux dernières lignes n'ont pas de Noms d'informations utiles pour distinguer les 2 fils, autre que d'ajouter manuellement le nom du message (qui je veux éviter). Comment puis-je obtenir le Nom/Contexte dans le journal pour le pool de threads les threads sans ajouter au message à chaque appel ou qui ont besoin pour définir la propriété de nouveau à chaque rappel.
source d'informationauteur My Other Me | 2010-05-21
Vous devez vous connecter pour publier un commentaire.
Les informations de contexte dans log4net est par fil, de sorte que chaque fois que vous démarrez un nouveau fil de discussion, vous devez ajouter vos informations de contexte. Vous pouvez utiliser les propriétés, ou vous pouvez utiliser la NDC. Le NDC est par thread trop, donc vous devez toujours avoir à l'ajouter à chaque contexte du thread à un certain point, qui pourrait ou pourrait ne pas être ce que vous cherchez. Il serait vous faire économiser de l'ajouter au message lui-même. Dans votre exemple, il serait quelque chose comme ceci:
Voici un lien vers le documentation de la SDN.
Dans l'ensemble, l'effet est similaire à l'aide des propriétés, tout comme ce que vous avez dans votre exemple. La seule différence est que la SDN peuvent être empilées de sorte que chaque fois que vous poussez une valeur sur la pile, il obtiendra concaténés pour les messages. Il prend également en charge l'instruction d'utilisation, ce qui le rend plus propre code.