Tracing v C#


Co je tracing?

Tracing (česky také trasování) je zaznamenávání informací o běhu aplikace. Tyto informace se odlišují od informací zapisovaných do logu – hlavní rozdíl mezi logováním a tracingem je ten, že informace zapisované při tracingu jsou určeny pro vývojáře a ne uživatele (nebo správce) aplikace. Tyto informace se používají pro ladění aplikace a pro diagnostiku chyb.

Tracing v C# aplikacích

.NET poskytuje nástroje pro tracing v namespacu System.Diagnostics (kde jsou i další velmi zajímavé třídy). Jedná se hlavně o třídy Trace a Debug. Rozdíl mezi těmito třídami je v zásadě ten, že pokud je aplikace zkompilována v Release módu, neobsahuj příkazy používající třídu Debug (jsou prostě ignorovány), ale příkazy používající třídu Trace jsou ve zkompilované aplikaci při Debug módu i při Release módu.

Tyto třídy poskytují přibližně stejné vlastnosti i přibližně stejné metody (Debug samozřejmě neobsahuje metody Trace…) a proto je dále popisována pouze práce s třídou Trace.

Zapisování informací do Trace výstupu

Pro zápis informací do Trace výstupu poskytuje třída Trace tři skupiny metod:

  • Trace…:
    • TraceError – zapíše informaci o chybě ve formátu “Blog.Tracing.exe Error: 0 : Zpráva předaná v parametru”
    • TraceInformation – zapíše prostou informaci, formát je odpovídající předchozímu (místo Error obsahuje Information)
    • TraceWarning – zapíše informaci o varování – opět podobně jako předchozí
  • Assert a Fail
    • Assert – ověřuje, zda byla splněna podmínka a v případě, že ne, zobrazí MessageBox s informacemi o chybě a možnostmi Přerušit, Opakovat nebo Ignorovat a zapíše požadovanou zprávu do výstupu ve formátu: “Neúspěch: Zpráva předaná v parametru (může být prázdná)”
    • Fail – stejné chování jako Assert s tím rozdílem, že žádnou podmínku nekontroluje a rovnou informuje o chybě
  • Write…:
    • Write – jednoduše zapíše zadanou informaci
    • WriteIf – zapíše zadanou informaci v případě, že je splněna podmínka
    • WriteLine – stejně jako Write s tím rozdílem, že provede odřádkování
    • WriteLineIf – stejně jako WriteIf s tím rozdílem, že provede odřádkování

Pomocí těchto metod můžeme v kódu zaznamenávat low-level informace, které nás o běhu aplikace zajímají a které chceme mít zaznamenané ve výstupu.

Zpracování Trace výstupu

Aplikace už zapisuje požadované informace do Trace výstupu, ale jak je zpracovat a zobrazit?

Informace zapisované pomocí výše popsaných metod posílají tyto zprávy objektům, které se nazývají listenery (instance tříd, které dědí z abstraktní třídy TraceListener). Tyto listenery jsou v kolekci Trace.Listeners. Defaultně tato kolekce obsahuje pouze jeden listener, listener typu DefaultTraceListener, který poskytuje defaultní výstup tracingu – do okna Output. Je ale možné použít i jiné listenery, například:

  • TextWriteTraceListener – přesměrovává výstup do třídy odvozené ze třídy Stream (takže například zapisuje do souboru nebo do konzole)
  • EventLogTraceListener – přesměrovává výstup do event logu

Samozřejmě vždy je možné vytvořit si vlastní listener, který bude zprávy zpracovávat přesně v požadovaném formátu.

Instance těchto listenerů je pro použití nutné přidat do statické kolekce Listeners třídy Trace. Je možné přidat tam libovolný počet listenerů – zapisované zprávy jsou posílané do všech.

Konfigurace tracingu – Trace Switches

.NET také poskytuje skvělé možnosti, jak tracing řídit. Tyto možnosti jsou dostupné hlavně díky třídám BooleanSwitch a TraceSwitch (existují ale i další spínače).

Tyto spínače jsou dostupné kdekoliv v aplikaci a je možné na základě jejich hodnoty určovat, zda do Trace výstupu zapsat nebo nezapsat.

BooleanSwitch poskytuje vlastnost Enabled (defaultně nastavena na false), která určuje, zda je tracing zapnutý nebo vypnutý. Tuto vlastnost je možné využít například s metodou Trace.WriteLineIf takto:

//Vytvoření BooleanSwitche
BooleanSwitch boolSwitch = new BooleanSwitch(
    "BoolSwitchTest", 
    "Testování BooleanSwitch");

//Použití BooleanSwitche
Trace.WriteLineIf(boolSwitch.Enabled, 
        "Zpráva zapsaná pouze pokud je BoolSwitchTest zapnutý");

TraceSwitch umožňuje přepínat mezi různými úrovněmi tracingu – výčet TraceLevel. TraceSwitch poskytuje vlastnost Level (typu TraceLevel – defaultně nastaveno TraceLevel.Off) a také jednotlivé bool vlastnosti – TraceError, TraceInfo, TraceVerbose a TraceWarning – které informují, zda je tracing pro danou úroveň zapnutý.

Příklad použití TraceSwitch:

//Vytvoření TraceSwitche
TraceSwitch traceSwitch = new TraceSwitch("TraceSwitchTest", "Testování TraceSwitch");

//Použití TraceSwitche
if (traceSwitch.TraceError)
{
    Trace.TraceError(
        "Zpráva zapsaná pouze pokud je nastavena úroveň umožňující zaznamenávat chyby");
}

Konfiguraci těchto switchů je možné provádět v kódu, ale nejlepší řešení je využít konfigurační soubor (App.config). Příklad jak nastavit výše zobrazené switche v konfiguračním souboru:

image

Tyto hodnoty je možné kdykoliv změnit bez toho, aby bylo nutné upravovat kód nebo znovu kompilovat aplikaci, což je výhoda konfigurace pomocí konfiguračního souboru.

Závěr

Tracing je v C# velmi jednoduše a velmi dobře použitelný a může poskytnout velmi užitečné informace o běhu aplikace. Pro bližší informace viz MSDN – vstupním bodem mohou být informace a odkazy u dokumentace ke třídě Trace – Třída Trace.

, , ,

Komentáře jsou uzavřeny.