2010-12-16 48 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)一起使用。

我還沒有在生產中使用這個項目,但我已經相當多地愚弄了它,並且給我留下了深刻的印象。它運作良好,易於擴展。