我有一个 TraceSource 对象,用于记录 VB.Net 应用程序的初始化。它附加了几个 TraceListener:
- 控制台跟踪监听器
- TextWriterTraceListener
- 事件日志跟踪监听器
对于前两个,我希望条目输出是“原始的”——也就是说,没有标准标题:
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 具有以下写入选项:
- 写()
- 写线()
- 跟踪数据()
- 跟踪事件()
- 跟踪传输()
最后 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 方法的文档中,它说:
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,因为无论如何它都被绕过了。但这也意味着我必须实现自己的过滤和切换机制(但这可能是一个可以让它以我想要的方式工作的代价)。