2010-12-07 49 views
25

J'ai récemment étudié la documentation sur TraceSource. Microsift dit que TraceSource est une nouvelle méthode et devrait être utilisée à la place de l'ancienne classe Trace.Comment utiliser TraceSource à travers les classes

// create single TraceSource instance to be used for logging 
static TraceSource ts = new TraceSource("TraceTest"); 

// somewhere in the code 
ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); 

Maintenant, ma question. Vous avez un grand projet avec plusieurs assemblées où vous avez beaucoup de classes. Supposons que vous souhaitiez suivre un peu de fonctionnalités spécifiques réparties entre les classes. L'idée évidente est que vous devez créer un TraceSource spécifique.

1) Pour travailler avec Tracesource, je dois d'abord créer une instance. Qu'est-ce que MS pense de partager cette instance entre différentes classes ou assemblées? Dois-je créer une classe fictive avec une propriété singleton statique? Que faites-vous dans ce cas.

2) Pourquoi ai-je besoin de l'instance de TraceSource? Chaque propriété est décrite dans le fichier de configuration. L'ancienne logique basée sur la classe Trace ne nécessitait pas d'instance et permettait uniquement de travailler avec des méthodes statiques.

Répondre

32

* 1. Définissez simplement le TraceSource dans chaque classe où vous voulez l'utiliser. Vous pouvez rendre le TraceSource statique afin qu'il soit partagé entre toutes les instances de la classe dans laquelle vous le définissez. Il n'est pas nécessaire de partager l'instance entre toutes les classes (types) qui ont besoin du "même" TraceSource. Chaque fois que vous décrémentez une nouvelle instance de TraceSource (TraceSource ts = new TraceSource ("nom de fichier"), vous obtenez un nouvel objet TraceSource, mais il fait référence aux mêmes informations de configuration.) Si vous créez une nouvelle TraceSource dans plusieurs classes et vous utiliserez le même nom pour chacune d'entre elles, vous obtiendrez différentes instances de TraceSource, mais elles seront toutes configurées de la même manière.En bref, il n'est pas nécessaire d'essayer de partager les instances de TraceSource entre les classes. une classe fictive avec un singleton. Voir mes exemples ci-dessous. J'ai également inclus plusieurs autres liens à partir d'ici SO qui décrivent comment travailler avec TraceSources.

// 
// In this example, tracing in classes A and B is controlled by the "TraceTest" TraceSource 
// in the app.config file. Tracing in class C is controlled by the "TraceTestTwo" 
// TraceSource in the app.config. 
// 
// In addition to using different TraceSource names, you can also use SourceSwitches 
// (in the app.config). See some examples of app.config in the 
// "turning-tracing-off-via-app-config" link below. 
// 

public class A 
{ 
    private static readonly TraceSource ts = new TraceSource("TraceTest"); 

    public void DoSomething() 
    { 
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); 
    } 
} 

public class B 
{ 
    // 
    //Use the same config info for TraceTest in this class 
    //It's ok to use a different instance of TraceSource, but with the same name, 
    //in this class, the new instance will be configured based on the params in the 
    //app.config file. 
    // 
    private static readonly TraceSource ts = new TraceSource("TraceTest"); 

    public void DoSomething() 
    { 
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); 
    } 
} 

public class C 
{ 
    // 
    //Use a different TraceSource in this class. 
    // 
    private static readonly TraceSource ts = new TraceSource("TraceTestTwo"); 

    public void DoSomething() 
    { 
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); 
    } 
} 

* 2. L'un des avantages à l'utilisation de plusieurs TraceSources est que vous avez un contrôle plus granulaire sur votre traçage. Vous pouvez tracer via "TraceTes t "à un niveau (ou pas du tout) et via" TraceTestTwo "à un niveau différent (ou, encore une fois, pas du tout). Vous pouvez envoyer chaque TraceSource à son propre TraceListener ou tout envoyer au même TraceListener, ou mélanger et faire correspondre. Comparez la possibilité d'adapter la configuration de TraceSources à la limitation de l'utilisation des méthodes statiques uniquement dans la classe Trace. Vous pouvez configurer où vont les informations de "trace" (quel TraceListener (s)) ou le niveau de l'information "trace", mais vous ne pouvez pas contrôler le niveau par classe ou par zone fonctionnelle comme vous pouvez utiliser TraceSources. Enfin, un avantage supplémentaire à plusieurs TraceSources est l'information de contexte «libre» que vous pouvez obtenir dans votre sortie. Par défaut (ou facultativement, je ne me souviens pas), le TraceListener enregistrera le nom du TraceSource qui a enregistré un message. Ainsi, vous pouvez regarder cette ligne dans votre sortie et avoir une idée de la classe ou de la zone fonctionnelle d'où elle provient sans avoir à mettre un journal d'informations contextuelles dans le site d'appel. Dans les exemples de code ci-dessus, la sortie de trace des classes A et B sera marquée avec "TraceTest" et la sortie de trace de la classe B sera étiquetée avec "TraceTestTwo". S'il vous plaît pardonner le bombardement lien ci-dessous, mais j'ai posté quelques assez bonnes informations (si je le dis moi-même!) Sur TraceSource et System.Diagnostics dans le passé.

Si vous allez utiliser TraceSource, pensez à utiliser la bibliothèque mentionnée dans ce message SO pour formater votre sortie comme log4net/NLog:

Does the .Net TraceSource/TraceListener framework have something similar to log4net's Formatters?

Voir ma réponse à this post pour plus d'informations sur l'utilisation TraceSource et quelques idées sur la façon dont vous pouvez améliorer votre «expérience TraceSource».

Plus d'info sur TraceSource: Add Trace methods to System.Diagnostics.TraceListener

Plus d'info sur TraceSource: System.Diagnostics.Debug namespace vs Other logging solutions (log4net, MS Enterprise Library, etc.)

Plus d'info sur TraceSource: Turning tracing off via app.config

+9

En utilisant plusieurs tracesources n'est pas bon quand il prend plusieurs threads. Les méthodes TraceSource sont thread-safe et utilisent un mécanisme de verrouillage. Par conséquent, le partage d'une instance de TraceSource sur plusieurs threads garantit un comportement sécurisé des threads. L'utilisation de plusieurs instances TraceSource produira un comportement différent. Néanmoins, il est sûr pour les threads, mais la sécurité des threads sera au niveau des écouteurs. Cela signifie que si deux threads tracent le même fichier en même temps, vous obtiendrez une copie de fichier guid-prefixed car le fichier original est verrouillé. –

+3

Je n'ai pas vraiment beaucoup utilisé TraceSource dans le code de production, et encore moins dans le code multi-thread. Voici un lien vers une publication de blog où l'auteur décrit l'utilisation du drapeau UseGlobalLock. Vous l'avez peut-être déjà vu et/ou vous pourriez ou non le trouver particulièrement utile. Il y a quelques autres articles dans son blog sur l'utilisation du traçage en utilisant System.Diagnostics. http://www.neovolve.com/post/2009/01/08/Disable-Trace-UseGlobalLock-For-Better-Tracing-Performance.aspx – wageoghe

+0

@wageoghe, le lien est rompu. – Spirit