【问题标题】:How to filter trace listened by event id?如何过滤事件ID监听的跟踪?
【发布时间】:2010-12-16 18:12:42
【问题描述】:

我正在使用下一个方法添加跟踪记录:

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>

【问题讨论】:

    标签: c# trace tracelistener traceswitch tracesource


    【解决方案1】:

    这是可能的,但您需要编写自定义 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>
    

    【讨论】:

      【解决方案2】:

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

      您仍然使用 System.Diagnostics.TraceSource 对象检测您的代码。

      就您而言,使用 Ukadc.Diagnostics 您可以根据大多数属性令牌(包括 EventId)进行过滤。

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

      我没有在生产中使用过这个项目,但是我已经玩弄了很多次并且印象深刻。它运行良好且易于扩展。

      【讨论】:

        猜你喜欢
        • 2020-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多