I have a TraceSource object that I use to log the initialization of a VB.Net application. It has several TraceListeners attached:

  • ConsoleTraceListener
  • TextWriterTraceListener
  • EventLogTraceListener

For the first two I want the entry output to be "raw" - that is, without the standard header:

SourceName TraceEventType: Id :

I have implemented a wrapper that does this when the TraceEventType is set to 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

I could do this for all the tracing, but then all entries in the EventLog would be listed with Level = Information. So I want to be able to specify the severity of the trace message, but I can't find any method on the TraceSource or the TraceListeners that allows me to do this. As far as I can tell, TraceListener has these options for writing to it:

  • Write()
  • WriteLine()
  • TraceData()
  • TraceEvent()
  • TraceTransfer()

The last 3 allows for providing a TraceEventType (which correctly labels the EventLog entries, but the resulting output to the console and the log file then includes the prefixes and ends up like this (for example):

Bootstrapper Warning: 0 : Failed to validate assembly

Is there a way to override how the ConsoleTraceListener and TextWriterTraceListener format their output to not include this header, while at the same time being able to tag the entries with a TraceEventType (for the EventLog)?

This is the best I have come up with so far:

For Each listener As TraceListener In _traceSource.Listeners
    If listener.GetType Is GetType(ConsoleTraceListener) OrElse listener.GetType Is GetType(Text
Edit
Report