I was wanting the output of the XmlWriterTraceListener to be formatted, so I figured I could just adjust some settings similar to the XmlWriter class and get formatting, indentation, etc. However, upon viewing the XmlWriterTraceListener code in Reflector, I found that it writes out its XML using a plain TextWriter, which means no intelligent XML formatting. I imagine this is for performance reasons or some other good reason, but if you really want or need formatted log output, you’re out of luck.

I decided the only way to keep the built-in behavior of the XmlWriterTraceListener but still allow formatted output was to re-implement the CLR class and override the output to use an XmlWriter. Using Reflector, I painstakingly implemented the exact same behavior and logic using an XmlWriter for output. My new class, FormattedXmlWriterTraceListener, inherits XmlWriterTraceListener for consistency and integration with the .Net tracing system. The real strange part was the constructors because I couldn’t pass down the file name or else it would try to start up the base class TextWriter logic. Instead, this implementation keeps track of its XmlWriter and path information in the instance. Properties have been added to support the various XmlWriter indentation and formatting options.

The source for the FormattedXmlWriterTraceListener is available on gist.github.com.