Poznáváme C# a Microsoft .NET - 72. díl - Zápis ladících a trasovacích informací

Třídy Debug a Trace jsou třídami, o kterých bude pojednávat dnešní díl. Pomocí těchto tříd jsme totiž schopni využít možností prostředí .NET pro podporu zápisu ladících a trasovacích hlášek.

Ladící a trasovací informace

Poměrně často, hlavně při vývoji složitějších aplikací, budeme chtít nějakým způsobem sledovat chování naší aplikace a to ať ještě při vývoji a testování nebo již při „ostrém“ provozu aplikace. Toto sledování chování aplikace se často realizuje pomocí zápisu ladících či trasovacích informací. Rozdíl mezi ladícími informacemi a trasovacími informacemi je v zásadě takový, že ladící informace jsou používány hlavně pří testovacím provozu aplikace a informace ladící jsou používány jak při testovacím provozu tak při běžném provozu aplikace. S tím v jakém prostředí jsou jednotlivé typy informací podávány samozřejmě závisí i jejich charakter. Trasovací informace jsou často podávány takřka „na každém kroku“, tedy dokonce například i při každém započetí  metody či jejím ukončení. Tedy podávají informace o průběhu aplikace. Smysl ladících informací je poněkud jiný, což plyne z důvodu, že jsou používány ve vývojovém a testovacím prostředí. Ladící informace obvykle nejčastěji podávají zprávy o výjimečných událostech v oblasti logiky aplikace.

Podpora v prostředí .NET

Podpora pro podávání ladících a trasovacích informací v prostředí .NET  je poměrně elegantně provedena. Umožňuje totiž bez nutnosti zásahů do zdrojového kódu aplikace určit, jestli aplikace běží v prostředí testovacím nebo běžném.

Stěžejními třídami pro uskutečnění zápisu ladících a trasovacích informací jsou třídy Trace a Debug. Jejich rozhraní pro zápis informací je takřka stejné, liší se ovšem v účelu pro jaký mají být tyto třídy použity. Pomocí třídy Trace jsou zapisovány trasovací informace a pomocí třídy Debug informace ladící. To jaké informace budou při spuštění aplikace podávány závisí na způsobu kompilace aplikace. Ladící informace jsou podávány pokud je aplikace zkompilována se symbolem DEBUG a informace trasovací jsou podávány v případě kompilace aplikace se symbolem TRACE. V případě použití vývojového prostředí Visual Studio .NET je při konfiguraci s názvem Debug definován jak symbol DEBUG tak symbol TRACE a při konfiguraci s názvem Release je definován pouze symbol TRACE. Tudíž pokud zkompilujete aplikaci v Visual Studiu .NET v konfiguraci Debug budou podávány jak informace ladící tak informace trasovací, ale v případě použití konfigurace Release budou podávány pouze informace trasovací.

Použití třídy Trace a Debug

Nyní již přejdeme k vlastnímu použití tříd, které nám umožní ladící a trasovací informace podávat. Základní metody pro zápis informací jsou u obou typu velmi podobné a oba typy se nalézají ve jmenném prostoru System.Diagnostics. Pomocí metod definovaných na těchto typech jsme tedy schopni zapisovat různé informace a je možné například definovat, že určitá hláška má být zapsána pouze v případě, že je splněna nějaká podmínka.

Kam budou námi specifikované hlášky zapisovány záleží na takzvaných posluchačích, které se registrují do seznamu těchto tříd. Pro jednotlivé cíle zápisu jsou definovány specifické typy posluchačů, kde každý tento typ je odvozený z typu TraceListener ze jmenného prostoru System.Diagnostics. V základní knihovně tříd .NET frameworku jsou definovány tyto typy tři, což jsou DefaultTraceListener, TextWriterTraceListener a EventLogTraceListener. Instance třídy DefaultTraceListener je implicitně jako jediná obsažena v kolekci Listeners tříd Trace a Debug a informace vypisuje do výstupu ladění a v případě podání informace o selhání pomocí metody Fail tříd Trace a Debug zobrazí informační okno. Třída TextWriterTraceListener umožňuje zapisovat do datových proudů a EventLogTraceListener do logu událostí systému Windows.

Následující zdrojový kód ukazuje použití třídy Debug pro zápis ladících informací. V případě, že bychom chtěli zapsat trasovací informace použili bychom stejným způsobem třídy Trace.

public static void RunWriting()
{
 try
 {
  //vytvoreni instance posluchace asociovaneho s vystupem na konzoli
  TextWriterTraceListener consoleListener = new TextWriterTraceListener(Console.Out);
  //vytvoreni instance posluchace asociovaneho s textovym souborem
  TextWriterTraceListener fileListener = new TextWriterTraceListener("debug.txt");
               //odstraneni vychoziho posluchace
                Debug.Listeners.Clear();
                //pridani posluchacu do seznamu pro debugovani
  Debug.Listeners.Add(consoleListener);
  Debug.Listeners.Add(fileListener);
  Console.Write("Zadejte cislo : ");
  int i = int.Parse(Console.ReadLine());
  //vypsani zpravy pro debug
  Debug.WriteLine("Debugovaci zprava");
  //odsazeni
  Debug.Indent();
  //vypsani zpravy za urcite podminky
  Debug.WriteLineIf(i < 10, "Nactene cislo je mensi nez 10");
  //snizeni odsazeni
  Debug.Unindent();
  Debug.WriteLine("Druha debugovaci zprava");
 }
 finally
 {
  //uzavreni streamu vsech posluchacu
  foreach(TraceListener listener in Debug.Listeners)
  {
                  listener.Flush();
                  listener.Close();
  }
 }
}

V příkladu jsou vytvořeny dva posluchači typu TextWriterListener, kde jeden je asociován z datovým proudem standardního výstupu (Console.Out) a druhý se souborem. Pak je pomocí metody Clear na vlastnosti Listeners vymazán seznam posluchačů, čímž se zařídí odstranění výchozího posluchače typu DefaultTraceListener. Pomocí metody Add se přidají námi vytvořené instance posluchačů do seznamu. Po té jsou pomocí metod WriteLine a WriteLineIf zapsány nějaké hlášky. Také jsou v příkladu použity metody Indent a Unindent k osazování.

V některých situacích může být užitečné využít metody Assert, která zapíše specifickou hlášku v případě, že podmínka, která je metodě předána, není splněna.

Console.Write("Zadejte cislo : ");
int i = int.Parse(Console.ReadLine());
Debug.Assert(i < 10, "Nactene cislo je vetsi nez 10");

Můžeme samozřejmě využít služeb instance posluchače DefaultTraceListener, který je implicitně v kolekci obsažen. Například v následujícím zdrojovém kódu je u této instance použita vlastnost LogFile, která zařídí, že kromě výpisů hlášek na ladící výstup, budou hlášky vypisovány i do specifikovaného souboru. Kromě toho je v příkladu zavolána metoda Fail, sloužící k reportování chyby a instance DefaultTraceListener na toto reaguje zobrazením informačního okna.

DefaultTraceListener defaultListener;
if (Debug.Listeners["Default"] is DefaultTraceListener)
{
     defaultListener = (DefaultTraceListener)Debug.Listeners["Default"];
     defaultListener.LogFileName = @"C:\debug.txt";   
}
Debug.Fail("Zprava o selhani !");

Instance posluchačů je možné přidávat i jinou cestou než na úrovni vlastního zdrojového kódu a to v konfiguračním souboru assembly (jménoAssembly.config), jak můžete vidět níže.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log" />
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>

Uvedeným zápisem do konfiguračního souboru byla přidána instance posluchače typu TextWriterTraceListener, který je asociován se soborem myListener.log. Mimo to je atributem autoflush nastavena vlastnost AutoFlush třídy Trace.

Příklady ke článku jsou ke stažení zde.

Diskuze (3) Další článek: Nové akční ADSL nabídky Českého Telecomu a Tiscali

Témata článku: , , , , , , , , ,