イベント ID によってリッスンされたトレースをフィルターするにはどうすればよいですか?
-
11-10-2019 - |
質問
次の方法を使用してトレースレコードを追加しています。
TraceSource.TraceEvent(TraceEventType, Int32, String)
ここで、Int32 はイベント ID を表します。
では、指定されたイベント ID によってのみリッスンするように TraceSwitch でフィルターするにはどうすればよいでしょうか?これは不可能ですか?
<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>
解決
それは可能ですが、あなたはカスタムを書く必要があります TraceFilter オーバーライドします トレースが必要です 方法。 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>
他のヒント
あなたが試すことができます codeplex からの Ukadc.Diagnostics. 。このプロジェクトは、System.Diagnostics にいくつかの便利な拡張機能を提供します。私の意見では、彼らが提供する最も素晴らしい点は、log4net や NLog で実現できるものと同様のログ/トレース出力形式を定義するために使用できるトークン ベースのシステムです。これは構成のみの依存関係です。つまり、コードですでに TraceSources を使用している場合は、Ukadc.Diagnostics をマシンに配置し、app.config でその TraceListeners や PropertyTokens などを指すようにするだけで済みます。
コードのインストルメント化には引き続き System.Diagnostics.TraceSource オブジェクトを使用します。
要点を言えば、Ukadc.Diagnostics を使用すると、ほとんどのプロパティ トークン (EventId を含む) に基づいてフィルタリングできます。
トークン システムは、(私が知る限り) Ukadc.Diagnostics で提供される対応する TraceListener (またはその基本 TraceListener クラスに基づいて作成した任意の TraceListener) でのみ使用できることに注意してください。
私はこのプロジェクトを実稼働環境で使用したことはありませんが、かなり試してみて、非常に感銘を受けました。うまく機能し、拡張も簡単です。