如何跨类使用TraceSource

我最近在研究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"); 

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

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

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

* 1。 只需在要使用它的每个类中定义TraceSource。 您可以使TraceSource成为静态,以便它在您定义它的类的所有实例之间共享。无需在需要“相同”TraceSource的所有类(类型)之间共享实例。 每次你取消一个新的TraceSource(TraceSource ts = new TraceSource(“somename”); instance,你会得到一个新的TraceSource对象,但是它引用相同的配置信息。所以,如果你在几个类中创建一个新的TraceSource,你为每一个使用相同的名称,你将得到不同的TraceSource实例,但它们都将被配置相同。简而言之,没有必要尝试在类之间共享TraceSource实例。也没有必要创建一个带有静态单例的虚拟类。请参阅下面的示例。我还在此处包含了几个链接,其中描述了如何使用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。 使用多个TraceSources的一个好处是您可以更精细地控制跟踪。 您可以在一个级别(或根本不跟踪)通过“TraceTest”跟踪,也可以通过不同级别的“TraceTestTwo”跟踪(或者,根本不跟踪)。 您可以将每个TraceSource发送到它自己的TraceListener,或者将所有TraceSource发送到相同的TraceListener,或者混合和匹配。 将定制各个TraceSource配置的能力与仅使用Trace类上的静态方法的限制进行比较。 您可以配置“跟踪”信息的位置(TraceListener(s))或“跟踪”信息的级别,但是您无法像使用TraceSources那样控制每个类或每个function区域的级别。 最后,多个TraceSources的另一个好处是可以在输出中获得的“免费”上下文信息。 默认情况下(或者我不记得),TraceListener将记录记录消息的TraceSource的名称。 因此,您可以在输出中查看该行,并了解其来自的类或function区域,而无需在调用站点中记录上下文信息。 在上面的代码示例中,类A和B的跟踪输出将使用“TraceTest”标记,而类B的跟踪输出将使用“TraceTestTwo”标记。

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

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

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

有关使用TraceSource的更多信息以及如何改进“TraceSource体验”的一些想法,请参阅本文中的回答。

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

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

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