首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何跨类使用TraceSource

如何跨类使用TraceSource
EN

Stack Overflow用户
提问于 2010-12-07 20:44:58
回答 1查看 16.1K关注 0票数 27

我最近在研究有关TraceSource的文档。Microsift表示,TraceSource是一种新的方式,应该用来代替旧的Trace类。

代码语言:javascript
复制
// 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");

现在我的问题来了。您有一个包含多个程序集的大型项目,其中包含许多类。假设您想要跟踪跨类传播的特定功能。显而易见,您需要创建一个特定的TraceSource。

1)要使用Tracesource,我需要先创建实例。MS对在不同的类或程序集之间共享此实例有何想法?我应该创建一个具有静态单例属性的虚拟类吗?你在这种情况下做什么。

2)为什么需要TraceSource实例?每个属性都在配置文件中进行了描述。基于Trace类的旧逻辑不需要一些实例,只提供了使用静态方法的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-09 03:26:31

*1.只需在需要使用的每个类中定义TraceSource即可。您可以将TraceSource设为静态,以便在您定义它的类的所有实例之间共享它。不需要在需要“相同”TraceSource的所有类(类型)之间共享实例。每次你创建一个新的TraceSource (TraceSource ts = TraceSource (“TraceSource”);实例时,你会得到一个新的TraceSource对象,但是它引用了相同的配置信息。因此,如果您在多个类中的每个类中创建一个新的TraceSource,并且对每个类使用相同的名称,那么您将获得不同的TraceSource实例,但它们的配置都是相同的。简而言之,不需要尝试在类之间共享TraceSource实例。也不需要创建一个带有静态单例的虚拟类。请看我下面的例子。从这里开始,我还包含了几个更多的链接,以描述如何使用TraceSources。

代码语言:javascript
复制
//
// 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.使用多个TraceSources的一个好处是您可以对跟踪进行更细粒度的控制。您可以通过"TraceTest“在一个级别(或者根本不跟踪)和通过"TraceTestTwo”在不同的级别(或者根本不跟踪)进行跟踪。您可以将每个TraceSource发送到其自己的TraceListener,也可以将所有TraceListener发送到同一个all,或者混合匹配。将定制单个跟踪的配置的能力与仅在TraceSources类上使用静态方法的限制进行比较。您可以配置“跟踪”信息的位置(哪些TraceListener)或“跟踪”信息的级别,但不能像使用TraceSources时那样控制每个类或每个功能区域的级别。最后,多个TraceSources的另一个好处是您可以在输出中获得“免费”上下文信息。默认情况下(或者我不记得了),TraceListener将记录记录消息的TraceSource的名称。因此,您可以查看输出中的行,并了解它来自的类或功能区域,而不必在调用站点中放置上下文信息日志。在上面的代码示例中,来自类A和B的跟踪输出将被标记为"TraceTest“,而来自类B的跟踪输出将被标记为"TraceTestTwo”。

请原谅下面的链接轰炸,但我已经发布了一些很好的信息(如果我自己这么说的话!)关于TraceSource和System.Diagnostics的过去。

如果你打算使用TraceSource,考虑使用这篇文章中提到的库来格式化你的输出,比如log4net/NLog:

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

有关使用TraceSource的更多信息,以及如何改善"TraceSource体验“的一些想法,请参阅我在this post中的回答。

有关TraceSource的更多信息,请访问:Add Trace methods to System.Diagnostics.TraceListener

有关TraceSource的更多信息,请访问:System.Diagnostics.Debug namespace vs Other logging solutions (log4net, MS Enterprise Library, etc.)

有关TraceSource的更多信息,请访问:Turning tracing off via app.config

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4376699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档