VB.Net アプリケーションの初期化をログに記録するために使用する TraceSource オブジェクトがあります。いくつかの TraceListeners がアタッチされています。
- ConsoleTraceListener
- TextWriterTraceListener
- EventLogTraceListener
最初の 2 つについては、エントリの出力を「生」にする必要があります。つまり、標準ヘッダーなしです。
SourceName TraceEventType: Id :
TraceEventType が Verbose に設定されている場合にこれを行うラッパーを実装しました。
If _buffer.EventType = TraceEventType.Verbose Then
For Each listener As TraceListener In _traceSource.Listeners
listener.Write(_buffer.Text)
Next
Else
_traceSource.TraceEvent(_buffer.EventType, id, _buffer.Text)
End If
すべてのトレースに対してこれを行うこともできますが、EventLog のすべてのエントリが Level = Information でリストされます。したがって、トレース メッセージの重大度を指定できるようにしたいのですが、TraceSource または TraceListeners でこれを可能にするメソッドが見つかりません。私が知る限り、TraceListener には次の書き込みオプションがあります。
- 書く()
- WriteLine()
- TraceData()
- TraceEvent()
- TraceTransfer()
最後の 3 つは TraceEventType を提供することを可能にします (これは EventLog エントリに正しくラベルを付けますが、コンソールとログ ファイルへの結果の出力にはプレフィックスが含まれ、次のようになります (例):
Bootstrapper Warning: 0 : Failed to validate assembly
ConsoleTraceListener と TextWriterTraceListener がこのヘッダーを含まないように出力をフォーマットする方法をオーバーライドすると同時に、TraceEventType (EventLog 用) でエントリにタグを付けることができる方法はありますか?
これは私がこれまでに思いついた最高のものです:
For Each listener As TraceListener In _traceSource.Listeners
If listener.GetType Is GetType(ConsoleTraceListener) OrElse listener.GetType Is GetType(TextWriterTraceListener) Then
listener.Write(_buffer.Text)
Else
listener.TraceEvent(Nothing, _traceSource.Name, _buffer.EventType, id, _buffer.Text)
End If
Next
これは機能しているようですが、MicrosoftのTraceListener.TraceEvent Methodに関するドキュメントには次のように書かれています。
Important: This method is not intended to be called directly by application code but by members of the Debug, Trace, and TraceSource classes to write trace data to output.
..だから、それが良いことかどうかはわかりませんか?
編集:
ここで最後の例のようなことをすると、とにかくバイパスされるため、TraceSource はまったく必要ないことに気付きました。しかし、それはまた、独自のフィルタリングとスイッチングのメカニズムを実装しなければならないことも意味します (しかし、それは、私が望むように動作させるために支払っても問題ないかもしれません)。