Mit C# in der Windows-Ereignisanzeige schreiben

Wenn es um das Thema „Logging“ geht, gibt es bei C# beliebig viele verschiedene Ansätze. Neben den weit verbreiteten Logging-„Frameworks“ wie u.a. log4net, besteht in C# ebenfalls die Möglichkeit in den Windows-„Log“ (im Deutschen Ereignisanzeige) seine Fehler und andere Probleme abzulegen. Aber was wird benötigt, um dorthin schreiben zu können? Nun zunächst muss die Anwendung, um dorthin schreiben zu können, seit Windows Vista im Administrator Modus laufen. Wie man dies für die Anwendung voraussetzen kann, folgt noch in einem weiteren Blog-Post, lässt sich aber auch schnell mittels Google lösen. Stichwort: Manifest.

Nun, sobald unsere Anwendung im Administratormodus ausgeführt wird, benötigt es nur wenige Codezeilen, um die Ereignisanzeige nutzen zu können. Noch als kleiner Hinweis vorweg: Es ist zwar schön und nett dort die Fehler und Warnungen zu protokollieren, ich würde jedoch persönlich trotzdem Dinge wie log4net verwenden, da diese bei richtiger Benutzung die Fehlersuche im Fehlerfall enorm erleichtern. Aber kommen wir nun zum Sourcecode. Als erstes müssen wir prüfen, ob unsere „Event-Source“ schon existiert und wenn nicht diese anlegen. Hierbei bietet es sich an, die „Event-Source“ als Konstante in der ganzen Anwendung zur Verfügung zu haben.

const string EVENT_SOURCE = "MyApplicationSource";
if (!EventLog.SourceExists(EVENT_SOURCE))
	EventLog.CreateEventSource(EVENT_SOURCE, "Application");

Nun können wir das Log auch schon nutzen. Die Parameter dafür sind sehr simpel und eigentlich selbsterklärend. Der erste Parameter stellt unsere „Event-Source“ dar, der zweite die Nachricht / Exception oder was auch immer in der Ereignisanzeige protokolliert werden soll. Anschließend der Log-Typ, welcher ähnlich wie bei log4net funktioniert und zum Abschluss unsere Ereignis ID, welche nach Möglichkeit für jeden Log-Eintrag einzigartig sein sollte, um so später diese Mitteilungen für die Fehlersuche verwenden zu können.

EventLog.WriteEntry(EVENT_SOURCE, "Some test entry", EventLogEntryType.Warning, 1337);