Comment utiliser TraceSource entre les classes
J'étudiais récemment la documentation sur TraceSource . Microsift dit que TraceSource est une nouvelle façon et devrait être utilisé à la place de L'ancienne classe de Trace.
// 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 assemblages où vous avez beaucoup de classes. Disons que vous voulez tracer un peu spécifique de fonctionnalité qui est répartie entre les classes. L'idée évidente est que vous devez créer une TraceSource spécifique .
1) pour travailler avec Tracesource, j'ai besoin de créer une instance premier. QU'est-ce que MS pense du partage de cette instance entre différentes classes ou assemblages? Dois-je créer une classe factice avec la propriété singleton statique? Que faites-vous dans ce cas.
2) Pourquoi ai-je besoin D'une instance 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 fournissait le moyen de travailler uniquement avec des méthodes statiques.
1 réponses
*1. Définissez simplement la TraceSource dans chaque classe où vous voulez l'utiliser. Vous pouvez rendre TraceSource statique afin qu'elle soit partagée entre toutes les instances de la classe dans laquelle vous la définissez. Pas besoin de partager l'instance entre toutes les catégories (types) qui ont besoin de la "même" TraceSource. Chaque fois que vous decleare une nouvelle TraceSource (TraceSource ts = new TraceSource("somename"); instance, vous obtenez un nouvel objet TraceSource, mais il fait référence aux mêmes informations de configuration. Donc, si vous créez un nouveau TraceSource dans chacune de plusieurs classes et vous utilisez le même nom pour chacune, 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 TraceSource entre les classes. Il n'est pas non plus nécessaire de créer une classe factice avec un singleton statique. Voir mes exemples ci-dessous. J'ai également inclus plusieurs autres liens à partir D'ici afin de décrire 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. Un avantage à l'utilisation de multiples TraceSources est que vous avez un contrôle plus granulaire sur votre traçage. Vous pouvez tracer via "TraceTest" à un niveau (ou pas du tout) et via "TraceTestTwo" à un niveau différent (ou, encore, pas du tout). Vous pouvez envoyer chaque TraceSource à son propre TraceListener ou tout envoyer au même TraceListener, ou mélanger et assortir. Comparez la possibilité d'adapter la configuration de TraceSources individuelles à la limitation d'utiliser uniquement les méthodes statiques sur la classe de Trace. Vous pouvez configurer où le " trace" les informations vont (quel TraceListener (s)) ou le niveau des informations "trace", mais vous ne pouvez pas contrôler le niveau par classe ou par zone fonctionnelle comme vous le pouvez lors de L'utilisation de TraceSources. Enfin, un avantage supplémentaire pour plusieurs TraceSources est l'information de contexte "libre" que vous pouvez obtenir dans votre sortie. Par défaut (ou éventuellement, Je ne me souviens pas), TraceListener enregistrera le nom de TraceSource qui a enregistré un message. Donc, vous pouvez regarder cette ligne dans votre sortie et avoir une idée de la classe ou la zone fonctionnelle d'où elle vient 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 étiquetée avec "TraceTest" et la sortie de trace de la Classe B sera étiquetée avec "TraceTestTwo".
Veuillez pardonner le lien bombardement ci-dessous, mais j'ai posté de très bonnes informations (si je le dis moi-même!) à propos de TraceSource et System.Diagnostics dans le passé.
Si vous allez pour utiliser TraceSource, pensez à utiliser la bibliothèque mentionnée dans ce post SO pour formater votre sortie comme log4net / NLog:
Voir ma réponse dans ce post pour plus d'informations sur L'utilisation de TraceSource et quelques idées sur la façon dont vous pouvez améliorer votre "expérience TraceSource".
Plus d'informations sur TraceSource: ajouter des méthodes de Trace à Système.Diagnostic.TraceListener
Plus d'informations sur TraceSource: système.Diagnostic.Debug namespace vs autres solutions de journalisation (log4net, ms Enterprise Library, etc.)
Plus d'informations sur TraceSource: désactiver le traçage via l'application.config