Trace vs Debug

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:

1

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:

2

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);

Leave a Reply

Your email address will not be published.