Protokolování a trasování v aplikacích .NET

Dokončeno

Až budete pokračovat v vývoji aplikace a bude složitější, budete pro aplikaci chtít použít další diagnostiku ladění.

Trasování je způsob, jak monitorovat průběh spouštění aplikace. Při vývoji můžete do aplikace .NET přidat instrumentaci trasování a ladění. Tuto instrumentaci můžete použít při vývoji aplikace a po jejím nasazení.

Tato jednoduchá technika je překvapivě silná. Můžete jej použít v situacích, kdy potřebujete víc než jen ladicí program.

  • Problémy, ke kterým dochází v průběhu dlouhých časových období, může být obtížné ladit pomocí tradičního ladicího programu. Protokoly umožňují podrobnou následnou analýzu, která pokrývá dlouhá období. Ladicí programy jsou naopak omezené na analýzu v reálném čase.
  • Vícevláknové aplikace a distribuované aplikace jsou často obtížné ladit. Připojení ladicího programu obvykle mění chování. Podrobné protokoly můžete analyzovat podle potřeby, abyste porozuměli složitým systémům.
  • Problémy v distribuovaných aplikacích můžou vzniknout při složité interakci mezi mnoha komponentami. Nemusí být rozumné připojit ladicí program ke každé části systému.
  • Mnoho služeb by nemělo být zastaveno. Připojení ladicího nástroje často způsobuje vypršení časového limitu.
  • Problémy nejsou vždy předvídatelné. Protokolování a trasování jsou navržené pro nízkou režii, aby se programy mohly vždy zaznamenávat v případě, že dojde k problému.

Zápis informací do výstupních oken

Do této chvíle jsme pomocí konzoly zobrazili informace uživateli aplikace. Existují i jiné typy aplikací vytvořených pomocí .NET, které mají uživatelská rozhraní, jako jsou mobilní, webové a desktopové aplikace, a žádná viditelná konzola. V těchto aplikacích System.Console loguje zprávy "v zákulisí." Tyto zprávy se můžou zobrazit ve výstupním okně ve vývojovém prostředí Visual Studio nebo Visual Studio Code. Mohou být také výstupem do systémového logu, jako je logcatAndroidu. V důsledku toho byste měli pečlivě zvážit použití System.Console.WriteLine v jiné než konzolové aplikaci.

Tady můžete kromě System.Consolepoužít System.Diagnostics.Debug a System.Diagnostics.Trace . Debug i Trace jsou součástí System.Diagnostics a budou zapisovat do protokolů pouze, když je připojen příslušný naslouchací proces.

Volba rozhraní API pro styl tisku, které se má použít, je na vás. Mezi hlavní rozdíly patří:

  • System.Console
    • Vždy povolená a vždy zapisuje do konzoly.
    • Užitečné pro informace, které může zákazník potřebovat vidět ve vydané verzi.
    • Vzhledem k tomu, že se jedná o nejjednodušší přístup, často se používá pro dočasné ladění ad hoc. Tento ladicí kód se skoro nikdy nekontroluje do správy zdrojového kódu.
  • System.Diagnostics.Trace
    • Povoleno pouze v případech, kdy je definován TRACE.
    • Zapisuje do připojených naslouchacích procesů ve výchozím nastavení DefaultTraceListener.
    • Toto rozhraní API použijte při vytváření protokolů, které budou ve většině buildů povolené.
  • System.Diagnostics.Debug
    • Je aktivováno pouze, když je DEBUG definováno (v režimu ladění).
    • Zapíše do připojeného debuggeru.
    • Toto rozhraní API použijte při vytváření logů, které budou povoleny pouze v sestaveních ladění.
Console.WriteLine("This message is readable by the end user.");
Trace.WriteLine("This is a trace message when tracing the app.");
Debug.WriteLine("This is a debug message just for developers.");

Při návrhu strategie trasování a ladění se zamyslete nad tím, jak má výstup vypadat. Několik příkazů zápisu vyplněných nesouvisejícími informacemi vytvoří protokol, který je obtížně čitelný. Na druhou stranu, použití WriteLine k umístění souvisejících příkazů na samostatné řádky může ztížit rozlišení, které informace patří dohromady. Obecně platí, že pokud chcete zkombinovat informace z více zdrojů, použijte více příkazů Write a vytvořte tak jednu informativní zprávu. Příkaz WriteLine použijte, když chcete vytvořit jednu úplnou zprávu.

Debug.Write("Debug - ");
Debug.WriteLine("This is a full line.");
Debug.WriteLine("This is another full line.");

Tento výstup pochází z předchozího protokolování s Debug:

Debug - This is a full line.
This is another full line.

Definování konstant TRACE a DEBUG

Ve výchozím nastavení je konstanta DEBUG definována při spuštění aplikace v ladění. Můžete to řídit přidáním položky DefineConstants do souboru projektu ve skupině vlastností. Tady je příklad zapnutí TRACE pro konfigurace Debug i Release kromě DEBUG pro konfigurace Debug.

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <DefineConstants>TRACE</DefineConstants>
</PropertyGroup>

Pokud používáte Trace mimo ladicí program, budete muset nakonfigurovat naslouchací proces trasování, například dotnet-trace.

Podmíněné trasování

Kromě jednoduchých Write a WriteLine metod je také možnost přidávat podmínky s WriteIf a WriteLineIf. Například následující logika zkontroluje, jestli je počet nula, a pak zapíše ladicí zprávu:

if(count == 0)
{
    Debug.WriteLine("The count is 0 and this may cause an exception.");
}

Můžete to přepsat v jednom řádku kódu:

Debug.WriteLineIf(count == 0, "The count is 0 and this may cause an exception.");

Tyto podmínky můžete použít také s Trace a s příznaky, které definujete ve své aplikaci:

bool errorFlag = false;  
System.Diagnostics.Trace.WriteIf(errorFlag, "Error in AppendData procedure.");  
System.Diagnostics.Debug.WriteIf(errorFlag, "Transaction abandoned.");  
System.Diagnostics.Trace.Write("Invalid value for data request");

Ověřte, že existují určité podmínky.

Kontrolní výraz nebo příkaz Assert testuje podmínku, kterou zadáte jako argument příkazu Assert. Pokud se podmínka vyhodnotí jako true, nedojde k žádné akci. Pokud se podmínka vyhodnotí jako false, asercion selže. Pokud používáte ladicí sestavení, program přejde do režimu přerušení.

Metodu Assert můžete použít z Debug nebo Trace, které jsou v jmenném prostoru System.Diagnostics. Debug metody tříd nejsou součástí verze vašeho programu, takže nezvětšují velikost ani nezmenšují rychlost kódu vydané verze.

K volnému testování podmínek, které by měly být pravdivé, pokud je váš kód správný, použijte metodu System.Diagnostics.Debug.Assert. Předpokládejme například, že jste napsali celočíselnou funkci dělení. Podle pravidel matematiky nemůže být dělitel nikdy nulový. Tuto podmínku můžete otestovat pomocí kontrolního výrazu:

int IntegerDivide(int dividend, int divisor)
{
    Debug.Assert(divisor != 0, $"{nameof(divisor)} is 0 and will cause an exception.");

    return dividend / divisor;
}

Když tento kód spustíte v ladicím programu, vyhodnotí se kontrolní výraz. Porovnání se ale ve vydané verzi neprovádí, takže nevznikají žádné další překážky.

Poznámka

Pokud používáte System.Diagnostics.Debug.Assert, ujistěte se, že veškerý kód uvnitř Assert nezmění výsledky programu, pokud je Assert odebrán. V opačném případě můžete omylem zavést chybu, která se zobrazí jenom ve verzi vašeho programu. Dávejte pozor zejména na aserty, které obsahují volání funkce nebo procedury.

Použití Debug a Trace z oboru názvů System.Diagnostics představuje skvělý způsob, jak poskytnout další kontext při spuštění a ladění aplikace.