2010-12-16 45 views
2

我用下一个方法来添加一个跟踪记录:如何过滤由事件ID侦听的跟踪?

TraceSource.TraceEvent(TraceEventType, Int32, String) 

其中的Int32表示事件ID。

那么如何在TraceSwitch中只过滤指定的事件ID?这是不可能的?

<system.diagnostics> 
    <sources> 
     <source name="MyTraceSource" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch>" 
      <listeners> 
       <add name="console" type="System.Diagnostics.ConsoleTraceListener" /> 
      </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="sourceSwitch" value="?" /> 
    </switches> 
</system.diagnostics> 

回答

5

这是可能的,但你需要编写自定义TraceFilter并重写ShouldTrace方法。该ID被传递给它,但没有开箱即用的过滤器支持它。

然后,你可以在config文件声明它是这样的:

<source name="MyTraceSource" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch"> 
    <listeners> 
    <add name="console" type="System.Diagnostics.ConsoleTraceListener"> 
     <filter type="YourNamespace.YourFilter, YourAssembly, ..." /> 
    </add> 
    </listeners> 
</source> 
1

你可以试试Ukadc.Diagnostics from codeplex。该项目为System.Diagnostics提供了一些有用的扩展。在我看来,最酷的是它们提供的是一个基于令牌的系统,可用于定义日志/跟踪输出格式,类似于使用log4net和NLog可以实现的格式。它是仅配置的依赖项。也就是说,如果您的代码已经在使用TraceSources,则只需将Ukadc.Diagnostics放置在您的机器上,并将您的app.config指向它们的TraceListeners,PropertyTokens等。

您仍然使用System.Diagnostics .TraceSource对象。

基于您的观点,使用Ukadc.Diagnostics,您可以基于大多数属性令牌(包括EventId)进行过滤。

请注意,令牌系统只能使用(据我所知)与Ukadc.Diagnostics中提供的相应TraceListeners(或您基于其基本TraceListener类编写的任何TraceListener)一起使用。

我还没有在生产中使用这个项目,但我已经相当多地愚弄了它,并且给我留下了深刻的印象。它运作良好,易于扩展。