如何过滤由事件ID监听的跟踪?

时间:2010-12-16 18:12:42

标签: c# trace tracelistener traceswitch tracesource

我正在使用next方法添加跟踪记录:

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>

2 个答案:

答案 0 :(得分: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 :(得分: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)。

我没有在制作过程中使用过这个项目,但我已经愚弄了它,并且给我留下了深刻的印象。它运作良好,易于扩展。