Debugging
Using System.Diagnostics

Configuration File

Add the following to the app.exe.config file (must reside in the same folder and the app.exe):

<configuration>
...
<system.diagnostics>
    <sources>
      <source name="srcMyAppDebug" switchName="SourceSwitch" >
        <listeners>
          <add name="myTextListener" />
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="SourceSwitch" value="All" />
    </switches>
    <sharedListeners>
      <add name="myTextListener"
           type="System.Diagnostics.TextWriterTraceListener"
           initializeData="Debug.txt" />
    </sharedListeners>
    <trace autoflush="true" indentsize="4"></trace>
</system.diagnostics>
 
</configuration>

The SourceLevels used by the SourceSwitch (app.exe.config configuration file) could be any of these:

public enum SourceLevels
{
    All             = -1,
    Off             = 0,
    Critical        = 1,
    Error           = 3,
    Warning         = 7,
    Information     = 15,
    Verbose         = 31,
    ActivityTracing = 65280,
}

The listener could also be:

  <listeners>
     <add name="myXmlListener"
          type="System.Diagnostics.XmlWriterTraceListener"
          initializeData= "Debug.xml" />
  </listeners>

Writing Events

To write to the event log:

System.Diagnostics.Trace.TraceInformation("Some operation here: Hello World");
System.Diagnostics.Trace.TraceError("Error: Something failed here.");

Alternatively, and more flexible:

TraceSource srcMyApp = new TraceSource("srcMyAppDebug");
srcMyApp.TraceInformation("Some operation here: Hello World");
srcMyApp.TraceEvent(TraceEventType.Error, 0, "Error: Something failed here.");

The TraceEventType could be any of these:

public enum TraceEventType
{
    Critical    = 1,
    Error       = 2,
    Warning     = 4,
    Information = 8,
    Verbose     = 16,
    Start       = 256,
    Stop        = 512,
    Suspend     = 1024,
    Resume      = 2048,
    Transfer    = 4096,
}

Another example:

using System.Diagnostics;
 
private void WriteToEventLog(string message)
{
  string cs = "srcMyApp";
  EventLog elog = new EventLog();
 
  if (!EventLog.SourceExists(cs))
  {
     EventLog.CreateEventSource(cs, cs);
  }
 
  elog.Source = cs;
  elog.EnableRaisingEvents = true;
  elog.WriteEntry(message);
}

Another example (by Microsoft):

using System;
using System.Diagnostics;
using System.Threading;
 
class MySample{
 
    public static void Main(){
 
        // Create the source, if it does not already exist.
        if(!EventLog.SourceExists("MySource"))
        {
             //An event log source should not be created and immediately used.
             //There is a latency time to enable the source, it should be created
             //prior to executing the application that uses the source.
             //Execute this sample a second time to use the new source.
            EventLog.CreateEventSource("MySource", "MyNewLog");
            Console.WriteLine("CreatedEventSource");
            Console.WriteLine("Exiting, execute the application a second time to use the source.");
            // The source is created.  Exit the application to allow it to be registered.
            return;
        }
 
        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.Source = "MySource";
 
        // Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.");
 
    }
}