.Net:如何抑制TraceSource标头("SourceName TraceEventType:Id:")?

d7s*_*rai 8 .net logging trace listener output-formatting

我有一个TraceSource对象,我用它来记录VB.Net应用程序的初始化.它附加了几个TraceListeners:

  • 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
Run Code Online (Sandbox Code Playgroud)

我可以为所有跟踪执行此操作,但然后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
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但在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,因为它无论如何都被绕过了.但这也意味着我必须实现自己的过滤和切换机制(但这可能是一个好的代价,让它按照我想要的方式工作).

wag*_*ghe 0

查看codeplex 上的Ukadc.Diagnostics项目。它是 System.Diagnostics 的一个插件,使您能够根据需要格式化日志记录/跟踪输出(类似于使用 log4net 和 NLog 所做的事情)。您通过配置使用它,因此您的代码不会直接依赖该库。该库附带了用于格式化的可配置对象以及利用格式化所需的自定义 TraceListener。该库还使您可以轻松编写自己的格式化“令牌”和自己的 TraceListener。

例如,您可以将 Ukadc.Diagnostics ConsoleTraceListener 配置为使用如下格式的语句:

{DateTime} {Source} {EventType} {Message}
Run Code Online (Sandbox Code Playgroud)

记录的每条消息都会包含日期/时间、源名称、事件类型和消息。

尝试一下,我想你会喜欢的。我自己也用过它(主要是用于原型设计,还没有用于“真正的”产品)并取得了良好的成功。

请注意,对于某些标记(例如 DateTime),您还可以应用适合该类型的标准格式(例如,对于 DateTime,您可以指定写入日期/时间的格式)。

Ukadc.Diagnostics 附带的文件跟踪侦听器还允许使用令牌系统指定其文件名。