Quelle est la différence entre log4net.ThreadContext et log4net.LogicalThreadContext?

mis à jour le 18/11/2014 - en parcourant le dépôt source log4net, j'ai constaté que la mise en œuvre de LogicalThreadContext a été modifiée en novembre 2011 pour qu'il stocke ses propriétés en utilisant CallContext.LogicalSetData (et les obtient en utilisant LogicalGetData). Ceci est important car cela signifie que le Contextelogicalthread devrait maintenant fonctionner correctement. Toutes les données stockées dans LogicalThreadContext doivent être "acheminées" vers n'importe quel thread ou tâche enfant. Cela se compare au contexte thread (et à la ancienne implémentation de LogicalThreadContext) où les données stockées dans le contexte resteraient locales au thread courant et ne seraient pas acheminées vers des threads/tâches enfants.

si vous êtes intéressé, voici le changement:

http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs?r1=1165341&r2=1207948&diff_format=h

J'espère que quelqu'un arrivera sur cette vieille question vous trouverez ces informations utiles.

log4net fournit deux objets "thread context" différents: ThreadContext et LogicalThreadContext , dont chacun possède un sac de propriétés. ThreadContext a un ThreadContextProperties bag tandis que LogicalThreadContext a un LogicalThreadContextProperties bag.

ThreadContext est peut-être plus communément connu comme "MDC". LogicalContext est peut-être plus communément appelé "LDC". Je vais utiliser le nom court pour le reste de ce post.

MDC.Les propriétés sont implémentées en utilisant le système .Le filetage.Fil.SetData alors que LDC.Les propriétés sont implémentées en utilisant le système .Runtime.L'accès distant.De messagerie.CallContext.SetData .

pour comparaison, NLog expose seulement "MDC" (maintenant connu sous le nom de MappedDiagnosticContext) pour stocker le fil les propriétés locales. La mise en œuvre de NLog utilise le système.Le filetage.Fil.SetData, donc son implémentation est la même que celle de log4net.

dans log4net et NLog, les propriétés" MDC " sont stockées dans un dictionnaire qui est lui-même stocké dans le stockage local du thread.

dans un cas comme celui-ci, est-ce que stocker le dictionnaire dans une variable de membre de classe décorée avec [ThreadStatic] aurait été équivalent?

[ThreadStatic]
private static IDictionary<string, string> threadProperties;

Qu'est-ce que le déclaration équivalente (ou similaire) en utilisant la nouvelle classe ThreadLocal de .NET 4.0?

en fin de compte, Quelle est la différence réelle, pratique, entre LDC et MDC? Même après avoir lu les sujets du MSDN mentionnés ci-dessus, je n'y vois pas clair. Quand utiliserez-vous l'un par rapport à l'autre? Il semble que la grande majorité des références/exemples que je vois pour log4net et le contexte est pour GDC (global - que je comprends), NDC (imbriqué - que je comprends aussi), et MDC. La plupart des les références que je peux trouver à LDC (ou LogicalThreadContext) lors de googling sont liées à checkins dans les dépôts de code source de log4net, pas l'utilisation réelle. LDC ne soulève presque jamais de questions ou d'exemples.

j'ai trouvé ce lien qui offre des informations assez bonnes sur la différence avec L'un des développeurs de log4net, Nicko Cadell, mais il n'est toujours pas clair pour moi.

une question plus large, pas directement en rapport avec log4net est ce qui est la différence pratique entre le fil.SetData et CallContext.SetData?

selon CallContext article MSDN, les données CallContext peuvent être propagées à une autre Appdomaine. Pour être propagé, un élément de données stocké dans le CallContext doit exposer l'interface ILogicalThreadAffinative . Donc, cela semble être une différence entre le fil.SetData et CallContext.

Selon le lien Nicko Cadell, log4net n'implémente pas ILogicalThreadAffinative, de sorte que les propriétés LDC ne seront pas propagées.

peut-être qu'il y en a assez ici pour que je puisse répondre à ma propre question, peut-être pas. Je travaille encore sur la compréhension.

si vous utilisez log4net, utilisez-vous tous MDC, LDC, les deux? Si vous utilisez MDC, est-ce parce que la plupart des exemples du "monde réel" semblent l'utiliser? Si vous utilisez LDC, vous avez une raison spécifique d'utiliser il? Si vous utilisez les deux, comment choisissez-vous le moment d'utiliser lequel?

notez que j'ai vu certains articles concernant MDC (et peut-être LDC) peut-être ne pas fonctionner correctement en ASP.net applications due to thread switching. Je ne suis pas particulièrement intéressé par ce problème car je ne travaille pas dans ASP.net.

en fait, j'ai trouvé un couple de postes utiles ici pour que pourrait contribuer à la discussion:

quelles sont les meilleures pratiques pour utiliser le stockage local de thread dans .NET?

.Net: fil Logique et Thread Local Storage?

Merci d'avance!

28
demandé sur Community 2010-10-01 20:18:33

1 réponses

Avertissement: Ce sont des conjectures.

supposez que vous écrivez un serveur, et servir une requête signifie que vous devez parler à un tas de services différents. Étant un développeur entièrement moderne, vous faites ces requêtes de manière asynchrone, en coordonnant quand tout est répondu (ou chronométré) afin de répondre à la demande originale.

cela signifie que le travail correspondant à une seule requête est dispersé parmi de nombreux fils différents (traitement de la réponses des services web de façon asynchrone). I suspect que CallContext est utilisé pour propager le" tout ce que je fais est en raison de cette requête entrante " à différents threads, de sorte que vous pouvez rassembler tous les journaux pour cette requête ensemble. ThreadContext n'arrangerait rien. Notez que je suppose que tout le travail est effectué dans un seul AppDomain, donc votre préoccupation il n'y aurait pas de problème.

8
répondu Jon Skeet 2010-10-01 16:26:00