Search code examples
c#.netapp-configtracesystem.diagnostics

Native tracing functionality doesn't produce output


I am researching how to use the System.Diagnostics tracing functionality properly, but cannot get my code to work. I have already read the official docs about configuring tracing, creating and initializing trace listeners, the source element of the app.config and some related stackoverflow posts. The msdn doc about TraceSource made me really confused...

My app.config contains the following section:

<system.diagnostics>
    <sources>
        <source name="ApplicationTraceSource" switchName="ApplicationTraceSwitch" switchType="System.Diagnostics.SourceSwitch">
            <listeners>
                <add name="EventLogListener"   type="System.Diagnostics.EventLogTraceListener"   initializeData="PDS"     />
                <add name="TextLogListener"    type="System.Diagnostics.TextWriterTraceListener" initializeData="PDS.log" />
                <add name="ConsoleLogListener" type="System.Diagnostics.ConsoleTraceListener"    />

                <remove name="Default" />
            </listeners>
        </source>
        <source name="DatabaseActivitySource" switchName="DatabaseActivityTraceSwitch" switchType="System.Diagnostics.SourceSwitch">
            <listeners>
                <add name="QueryTextLogListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Queries.log" />

                <remove name="Default" />
            </listeners>
        </source>
    </sources>

    <switches>
        <!--Set value to 0 to turn of database activity log.-->
        <add name="DatabaseActivityTraceSwitch" value="1" />

        <!--Set value to 0 to turn of application log. 1 for errors. 2 for errors und warnings. 3 for more detailed error information. 4 for verbose trace information.-->
        <add name="ApplicationTraceSwitch" value="4" />
    </switches>
</system.diagnostics>

My code in my Program.cs is as simple as it can gets:

if (EventLog.SourceExists("PDS") == false)
{
    EventLog.CreateEventSource("PDS", "EventLogListener");
}

TraceSource applicationTraceSource = new TraceSource("ApplicationTraceSource");

applicationTraceSource.TraceInformation("i am information");

applicationTraceSource.TraceEvent(TraceEventType.Error, 1, "i am error event");
applicationTraceSource.TraceEvent(TraceEventType.Warning, 2, "i am warning event");
applicationTraceSource.TraceEvent(TraceEventType.Information, 3, "i am information event");
applicationTraceSource.TraceEvent(TraceEventType.Verbose, 4, " am verbose event");

applicationTraceSource.TraceData(TraceEventType.Error, 5, "i am error data");
applicationTraceSource.TraceData(TraceEventType.Warning, 6, "i am warning data");
applicationTraceSource.TraceData(TraceEventType.Information, 7, "i am information data");
applicationTraceSource.TraceData(TraceEventType.Verbose, 8, " am verbose data");

applicationTraceSource.Flush();

The file PDS.log is being created, but it's empty. The eventlog is empty. The console output is empty.

Can someone give me a hint with this?


Solution

  • The problem was that I looked at the TraceEventType and TraceLevel enum for setting my value of the switch in the app.config.

    The correct enum for this attribute is the SourceLevels flag.

    I changed the value of my switch. Following solutions are now working (if I want to trace every event):

    <add name="ApplicationTraceSwitch" value="-1" />
    

    or

    <add name="ApplicationTraceSwitch" value="ALL" />