如何跨类使用TraceSource

Cap*_*mic 27 .net c# logging trace

我最近在研究TraceSource的文档.Microsift说TraceSource是一种新方法,应该使用而不是旧的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");
Run Code Online (Sandbox Code Playgroud)

现在我的问题.你有大型项目,有几个程序集,你有很多类.假设您想跟踪跨类传播的特定功能.明显的想法是你需要创建一个特定的TraceSource.

1)要使用Tracesource,我需要先创建实例.什么是MS考虑跨各种类或程序集共享此实例?我应该创建一个具有静态单例属性的虚拟类吗?在那种情况下你在做什么

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

wag*_*ghe 35

*1.只需在要使用它的每个类中定义TraceSource.您可以使TraceSource保持静态,以便它在您定义它的类的所有实例之间共享.无需在需要"相同"TraceSource的所有类(类型)之间共享实例.每次你取消一个新的TraceSource(TraceSource ts = new TraceSource("somename"); instance,你会得到一个新的TraceSource对象,但它引用相同的配置信息.所以,如果你在几个类中创建一个新的TraceSource,你为每一个使用相同的名称,你会得到不同的TraceSource实例,但它们都将被配置相同.简而言之,没有必要尝试在类之间共享TraceSource实例.也没有必要创建带有静态单例的虚拟类.请参阅下面的示例.

//
// 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");   
  }
}
Run Code Online (Sandbox Code Playgroud)

*2.使用多个TraceSources的一个好处是您可以更精细地控制跟踪.您可以在一个级别(或根本不是)通过"TraceTest"跟踪,也可以通过不同级别的"TraceTestTwo"跟踪(或者,根本不跟踪).您可以将每个TraceSource发送到它自己的TraceListener,或者将all发送到同一个TraceListener,或者混合和匹配.将定制各个TraceSource配置的能力与仅使用Trace类上的静态方法的限制进行比较.您可以配置"跟踪"信息的位置(TraceListener(s))或"跟踪"信息的级别,但是您无法像使用TraceSources那样控制每个类或每个功能区域的级别.最后,多个TraceSources的另一个好处是"免费" 您可以在输出中获得的上下文信息.默认情况下(或者我不记得),TraceListener将记录记录消息的TraceSource的名称.因此,您可以查看输出中的该行,并了解它所来自的类或功能区域,而无需在调用站点中记录上下文信息.在上面的代码示例中,类A和B的跟踪输出将使用"TraceTest"标记,而类B的跟踪输出将使用"TraceTestTwo"标记.您可以在输出中查看该行,并了解它所来自的类或功能区域,而无需在调用站点中记录上下文信息.在上面的代码示例中,类A和B的跟踪输出将使用"TraceTest"标记,而类B的跟踪输出将使用"TraceTestTwo"标记.您可以在输出中查看该行,并了解它所来自的类或功能区域,而无需在调用站点中记录上下文信息.在上面的代码示例中,类A和B的跟踪输出将使用"TraceTest"标记,而类B的跟踪输出将使用"TraceTestTwo"标记.

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

如果您打算使用TraceSource,请考虑使用此SO帖子中提到的库来格式化输出,如log4net/NLog:

.Net TraceSource/TraceListener框架是否具有与log4net的Formatters类似的东西?

见我在回答这个职位有关使用TraceSource和你如何能提高你的"TraceSource体验"的一些想法更多的信息.

有关TraceSource的更多信息: 将跟踪方法添加到System.Diagnostics.TraceListener

有关TraceSource的更多信息:System.Diagnostics.Debug命名空间与其他日志记录解决方案(log4net,MS Enterprise Library等)

有关TraceSource的更多信息: 通过app.config关闭跟踪

  • 当需要多个线程时,使用多个traceource并不好.TraceSource方法是线程安全的,它使用锁定机制.因此,跨线程共享一个TraceSource实例可以保证线程安全行为.使用多个TraceSource实例将产生不同的行为.它仍然是线程安全的,但线程安全将在列表级别上.这意味着如果两个线程同时跟踪同一个文件,您将获得guid-prefixed文件副本,因为原始文件已被锁定. (10认同)
  • 我在生产代码中并没有真正使用过TraceSource,更不用说多线程代码了.以下是博客发布的链接,作者使用UseGlobalLock标志进行描述.您可能已经看过它和/或您可能会或可能不会发现它特别有用.他的博客中还有一些关于使用System.Diagnostics进行跟踪的文章.http://www.neovolve.com/post/2009/01/08/Disable-Trace-UseGlobalLock-For-Better-Tracing-Performance.aspx (3认同)