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 spouštění aplikace během jeho spuštění. 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 ho použít v situacích, kdy potřebujete více než 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 kontrolu po mortemu, která trvá dlouhou dobu. 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 má tendenci měnit 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 programu často způsobuje selhání časového limitu.
  • Problémy se neočekávejte vždy. 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 protokoluje zprávy "na pozadí". Tyto zprávy se můžou zobrazit ve výstupním okně v sadě Visual Studio nebo Visual Studio Code. Mohou také být výstupem do systémového protokolu, jako je Android logcat. V důsledku toho byste měli při použití System.Console.WriteLine v jiné než konzolové aplikaci vzít v úvahu velké pozornost.

To je místo, kde můžete použít System.Diagnostics.Debug a System.Diagnostics.Trace kromě System.Console. Oba Debug a Trace jsou součástí System.Diagnostics a budou zapisovat pouze do protokolů, když je připojen odpovídající 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 často nikdy nekontroluje do správy zdrojového kódu.
  • System.Diagnostics.Trace
    • Povoleno pouze v případech, kdy TRACE je definováno.
    • 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
    • Povoleno pouze v případech, kdy DEBUG je definován (v režimu ladění).
    • Zapíše do připojeného ladicího programu.
    • Toto rozhraní API použijte při vytváření protokolů, 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 druhé straně použití WriteLine k vložení souvisejících příkazů na samostatné řádky může být obtížné rozlišit, 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 při spuštění aplikace v ladění definována konstanta DEBUG . Můžete to řídit přidáním DefineConstants položky do souboru projektu ve skupině vlastností. Tady je příklad zapnutí TRACE konfigurace Debug a Release konfigurace kromě DEBUGDebug konfigurací.

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

Pokud k Trace ladicímu programu nepoužíváte připojení, budete muset nakonfigurovat naslouchací proces trasování, například dotnet-trace.

Podmíněné trasování

Kromě jednoduchých Write a WriteLine metod existuje 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 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 Assert příkaz 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, kontrolní výraz selže. Pokud používáte sestavení ladění, program přejde do režimu přerušení.

Metodu Assert můžete použít buď z oboru Debug názvů, nebo TraceSystem.Diagnostics z oboru názvů. 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.

Metodu System.Diagnostics.Debug.Assert použijte volně k testování podmínek, které by měly být splněny, pokud je váš kód správný. 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 příkaz kontrolního výrazu. Porovnání se ale ve verzi vydané verze neprodává, takže nejsou žádné další režijní náklady.

Poznámka

Pokud použijete System.Diagnostics.Debug.Assert, ujistěte se, že jakýkoli kód uvnitř Assert nemě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 kontrolní výrazy, které obsahují volání funkce nebo procedury.

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