Poniższy artykuł pochodzi z serii Przygotowań do egzaminu 70-536.
Systemowy podgląd zdarzeń (np. event log) jest repozytorium informacji o systemie operacyjnym, czynnościach aplikacji i błędach. Przykładowo znajdują się tam informacje o starcie systemu, czy jego zamknięciu. Aplikacje informują np. o zmianie ważnych ustawień. Korzystanie z systemowego podglądu zdarzeń jest alternatywą dla tworzenia własnych plików, dodatkowo wspierane jest przez .NET Framework, dzięki czemu nie musimy pisać dużo własnego kodu, aby z niego korzystać.

Dziennik systemu Windows
Rejestrowanie źródła zdarzeń
Przed dodaniem zdarzeń należy zarejestrować źródło zdarzenia (ang. event source) dla naszej aplikacji. Służy do tego statyczna metoda EventLog.CreateEventSource. Najlepiej wywołać ją podczas procesu instalacji, który wymaga uprawnień administratora.
Tworzymy nową aplikację konsolową (Console Application) – możemy nazwać ją np. EventLogDemo. Dodajemy odpowiednią dyrektywe using:
1: using System.Diagnostics;
Dodajemy kod:
1: if (!EventLog.SourceExists("EventLogDemo"))
2: {
3: EventLog.CreateEventSource("EventLogDemo", "Application");
4: }
Powyższy fragment kodu sprawdzi, czy źródło jest zarejestrowane i jeżeli nie – zarejestruje je do dziennika Aplikacja. Możemy połączyć zdarzenie z własnym plikiem dziennika. W tym celu podajemy jego nazwę:
1: if (!EventLog.Exists("EventLogDemo Log"))
2: {
3: EventLog.CreateEventSource("EventLogDemo", "EventLogDemo Log");
4: }
Zapisywanie zdarzeń
Zdarzenie do dziennika możemy zapisać przez instancję klasy EventLog. Ustawiamy w niej parametr Source, następnie wywołujemy metodę WriteEntry:
1: EventLog myLog = new EventLog("Application");
2: myLog.Source = "EventLogDemo";
3: myLog.WriteEntry("Błąd połączenia", EventLogEntryType.Error, 1001, 1);
Metod WriteEntry przyjmuje do pięciu parametrów: wiadomość, typ, ID zdarzenia, numer kategorii, dodatkowe informacja jako tablica typu byte.
Odczyt zdarzeń
Zdarzenia odczytujemy za pomocą kolekcji EventLog.Entries:
1: EventLog myLog = new EventLog("Application");
2: foreach (EventLogEntry entry in myLog.Entries){
3: Console.WriteLine(entry.Message);
4: }
Debug i Trace
Podczas pisania oprogramowania często pojawia się potrzeba wypisania komunikaty na konsolę, albo pokazania okienka z komunikatem. Jeżeli nie chcemy, aby komunikaty te znalazły się w wersji produkcyjnej możemy zastosować klasę Debug i jej metody statyczne. Jeżeli komunikaty mają pojawić się także w wersji Release – klasę Trace.
Domyślnie zarówno Debug, jak i Trace domyślnie wypisują tekst do okna Output w Visual Studio – załatwia to domyślny listener. Zachowanie to można rozszerzyć dodając kolejne listenery:
- DefaultTraceListener – wypisuje komunikaty w oknie Output Visual Studio,
- ConsoleTraceListener – wypisuje dane na konsoli,
- TextWriterTraceListener – wypisuje dane do pliku lub strumienia,
- XmlWriterTraceListener – wysyła dane do pliku XML wykorzystując obiekt typu TextWriter albo Stream,
- EventSchemaListener – XML kompatybilny z plikim schema,
- DelimitedListTraceListener, EventLogTraceListener;
Debug
Prosty przykład wykorzystania:
1: Debug.Listeners.Add(new ConsoleTraceListener());
2: Debug.AutoFlush = true;
3: Debug.Indent();
4: Debug.WriteLine("Starting application");
5: Console.WriteLine("Hello, world!");
6: Debug.WriteLine("Ending application");
7: Debug.Unindent();
Debug pozwala nam formatować swoje wyjście. Wywołanie Indent spowoduje wcięcie tekstu, parametrem IndentSize możemy ustawić poziom wcięcia, Unindent usunie wcięcie. Debug.WriteLine działa tak samo jak Console.WriteLine. Komuniaty zostaną wypisane w oknie programu i oknie Output Visual Studio. Właściwość Debug.AutoFlush określa, czy komunikat zostanie wypisany natychmiastowo. Jeśli opcję ustawimy na False komunikaty są zbierane i zostaną wyświetlone po wywołaniu metody Debug.Flush.
Metoda Debug.Assert służy do sprawdzania czegoś, co wiemy, że zawsze powinno być prawdą. Asercje nie powinny być wykorzystywane w wersji produkcyjnej aplikacji.
1: Boolean alway_true = false;
2: Debug.Assert(alway_true);

Trace
Trace, jak już wspomniałem, działa tak samo jak Debug, jednak wypisuje komunikaty zarówno w środowisku Debug, jak i Release.
1: Debug.Listeners.Add(new ConsoleTraceListener());
2: Debug.AutoFlush = true;
3: Debug.Indent();
4: Trace.WriteLine("Trace: Starting application");
5: Console.WriteLine("Hello, world!");
6: Trace.WriteLine("Trace: Ending application");
Kolejny artykuł z serii to 70-536: Working with Performance Counters