W .NET istnieją dwie przydatne klasy do logowania wszelkich informacji: Trace oraz Debug. Często różnica nie jest jasna oraz klasy są ze sobą mylone. Co się dokładnie dzieje, gdy napiszemy następujący fragment kodu?
Trace.WriteLine("Trace test"); Debug.WriteLine("Debug test");
Efekt wydaje się podobny, w okienku debug zobaczymy wykonane logi:
Najlepiej zajrzeć do źródeł powyższych klas. Debug.WriteLine wygląda następująco:
[System.Diagnostics.Conditional("DEBUG")] public static void WriteLine(string message) { TraceInternal.WriteLine(message); }
Z kolei Trace.WriteLine:
[System.Diagnostics.Conditional("TRACE")] public static void WriteLine(string message) { TraceInternal.WriteLine(message); }
Pozostałe metody Trace oraz Debug wyglądają analogicznie. Wszystkie z nich (zarówno Debug jak i Trace) korzystają z TraceInternal. Jedyna różnica to atrybut Conditional. Nie trudno domyślić się, że Debug będzie widoczny tylko w trybie Debug. Jeśli przejdziemy do Release, Debug.WriteLine nie zostanie skompilowany czyli nie zobaczymy nic na wyjściu. Z kolei symbol “TRACE” jest domyślnie zawsze włączany w proces kompilacji, co możemy sprawdzić we właściwościach projektu:
Warto również zauważyć, że za pomocą obydwu klas można zapisywać logi w dowolnych miejscach, również w plikach czy bazach danych. Wystarczy odpowiednio skonfigurować Listeners:
ConsoleTraceListener myWriter = new ConsoleTraceListener(); Trace.Listeners.Add(myWriter);
Taki zdolny Piotrek jesteś – nie dość, że tak dobrze w piłke kopiesz to jeszcze wytłumaczysz czym się różni debug od trace, pozdrawiam serdecznie