【发布时间】:2011-05-03 00:20:21
【问题描述】:
我有一个 TraceSource 对象,用于记录 VB.Net 应用程序的初始化。它附加了几个 TraceListener:
- ConsoleTraceListener
- TextWriterTraceListener
- EventLogTraceListener
对于前两个,我希望条目输出是“原始的”——即,没有标准头:
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,因为无论如何它都被绕过了。但这也意味着我必须实现自己的过滤和切换机制(但这可能是一个可以让它以我想要的方式工作的代价)。
【问题讨论】:
标签: .net logging trace listener output-formatting