Using EventProviderTraceListener


In .Net framework 3.5, there is a new trace listener, EventProviderTraceListener, which you can use to do ETW tracing. There are good introduction and some intimidating tips. It took me a while to figure out that, to do a simple ETW trace, you can just configure it like a normal trace listener by having an app config file like:


<configuration>


<system.diagnostics>


<trace autoflush=”true” indentsize=”4″>


<listeners>


<add name=”myListener” type=”System.Diagnostics.Eventing.EventProviderTraceListener, System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089″ initializeData=”{BF8671E1-2B70-41f3-AE0C-993C6A7D6763}” />


<remove name=”Default” />


</listeners>


</trace>


</system.diagnostics>


</configuration>


I put the event provider ID as initializeData and it seems to work. With that config file, you can simply use Trace.WriteLine(“my message”).


To start a trace session, do:


logman start mysession -p {BF8671E1-2B70-41f3-AE0C-993C6A7D6763} -o mytest.etl -ets


After you are done with tracing, you can stop by


logman stop mysession -ets


Then you can use tracerpt to dump the log to readable format.


tracerpt mytest.etl


ETW tracing is very customizable, but for doing simple tracing for debugging, it seems logging a message is enough. One advantage of using ETW tracing is performance. I did some simple measurement with a loop like:

            Stopwatch timePerParse = Stopwatch.StartNew();
for (int i = 0; i < 50000; ++i)
{
Trace.WriteLine(“this is using Trace”);
}
timePerParse.Stop();
MessageBox.Show(timePerParse.ElapsedMilliseconds.ToString());

The result is like (on a 2.4 GHz machine):

















Default trace listener with DBGView.exe


14196ms


TextWriterTraceListener


211ms


EventProviderTraceListener


77ms


Note: EventProviderTraceListener currently is only supported on Vista.


Keywords: ETW tracing EventProviderTraceListener System.Diagnostics.Eventing.EventProviderTraceListener logman.exe tracerpt.exe