Logboekregistratie en tracering in .NET-toepassingen

Voltooid

Wanneer u uw toepassing blijft ontwikkelen en het complexer wordt, wilt u aanvullende diagnostische gegevens over foutopsporing toepassen op uw toepassing.

Tracering is een manier om de uitvoering van uw toepassing te bewaken terwijl deze wordt uitgevoerd. U kunt tracerings- en foutopsporingsinstrumentatie toevoegen aan uw .NET-toepassing wanneer u deze ontwikkelt. U kunt deze instrumentatie gebruiken tijdens het ontwikkelen van de toepassing en nadat u deze hebt geïmplementeerd.

Deze eenvoudige techniek is verrassend krachtig. U kunt deze gebruiken in situaties waarin u meer nodig hebt dan een foutopsporingsprogramma:

  • Problemen die zich gedurende lange tijd voordoen, kunnen lastig zijn om fouten op te sporen met een traditioneel foutopsporingsprogramma. Logboeken bieden gedetailleerde post-mortembeoordeling die lange perioden beslaat. Foutopsporingsprogramma's zijn daarentegen beperkt tot realtime-analyses.
  • Toepassingen met meerdere threads en gedistribueerde toepassingen zijn vaak moeilijk om fouten op te sporen. Het koppelen van een foutopsporingsprogramma heeft de neiging om gedrag te wijzigen. U kunt zo nodig gedetailleerde logboeken analyseren om complexe systemen te begrijpen.
  • Problemen in gedistribueerde toepassingen kunnen ontstaan door een complexe interactie tussen veel onderdelen. Het is mogelijk niet redelijk om een foutopsporingsprogramma te verbinden met elk deel van het systeem.
  • Veel services mogen niet vastlopen. Het koppelen van een foutopsporingsprogramma veroorzaakt vaak time-outfouten.
  • Problemen worden niet altijd gepland. Logboekregistratie en tracering zijn ontworpen voor lage overhead, zodat programma's altijd kunnen worden opgenomen als er een probleem optreedt.

Informatie schrijven naar uitvoervensters

Tot nu toe hebben we de console gebruikt om informatie weer te geven aan de gebruiker van de toepassing. Er zijn andere typen toepassingen gebouwd met .NET die gebruikersinterfaces hebben, zoals mobiele, web- en desktop-apps, en er is geen zichtbare console. In deze toepassingen System.Console registreert u berichten 'achter de schermen'. Deze berichten worden mogelijk weergegeven in een uitvoervenster in Visual Studio of Visual Studio Code. Ze kunnen ook worden uitgevoerd naar een systeemlogboek zoals Android logcat. Als gevolg hiervan moet u goed rekening houden wanneer u in een niet-consoletoepassing gebruikt System.Console.WriteLine .

Dit is waar u kunt gebruiken System.Diagnostics.Debug en System.Diagnostics.Trace naast System.Console. Beide Debug en Trace maken deel uit van System.Diagnostics en schrijven alleen naar logboeken wanneer een geschikte listener is gekoppeld.

De keuze van welke afdrukstijl-API u wilt gebruiken, is aan u. De belangrijkste verschillen zijn:

  • System.Console
    • Altijd ingeschakeld en schrijft altijd naar de console.
    • Handig voor informatie die uw klant mogelijk moet zien in de release.
    • Omdat het de eenvoudigste benadering is, wordt deze vaak gebruikt voor ad-hoc tijdelijke foutopsporing. Deze foutopsporingscode wordt vaak nooit ingecheckt bij broncodebeheer.
  • System.Diagnostics.Trace
    • Alleen ingeschakeld wanneer TRACE deze is gedefinieerd.
    • Schrijft standaard naar gekoppelde listeners, de DefaultTraceListener.
    • Gebruik deze API wanneer u logboeken maakt die in de meeste builds worden ingeschakeld.
  • System.Diagnostics.Debug
    • Alleen ingeschakeld wanneer DEBUG deze is gedefinieerd (in de foutopsporingsmodus).
    • Schrijft naar een bijgevoegd foutopsporingsprogramma.
    • Gebruik deze API wanneer u logboeken maakt die alleen worden ingeschakeld in builds voor foutopsporing.
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.");

Wanneer u uw strategie voor tracering en foutopsporing ontwerpt, moet u nadenken over hoe de uitvoer eruit moet zien. Meerdere schrijfinstructies die zijn gevuld met niet-gerelateerde informatie, maken een logboek dat moeilijk te lezen is. Aan de andere kant, als u WriteLine gebruikt om gerelateerde instructies op afzonderlijke regels te plaatsen, kan het lastig zijn om te onderscheiden welke gegevens bij elkaar horen. Gebruik over het algemeen meerdere schrijfinstructies wanneer u informatie uit meerdere bronnen wilt combineren om één informatief bericht te maken. Gebruik de instructie WriteLine als u één volledig bericht wilt maken.

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

Deze uitvoer is afkomstig uit de voorgaande logboekregistratie met Debug:

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

TRACE- en FOUTOPSPORINGsconstanten definiëren

Wanneer een toepassing wordt uitgevoerd onder foutopsporing, wordt de DEBUG constante standaard gedefinieerd. U kunt dit beheren door een DefineConstants vermelding toe te voegen aan het projectbestand in een eigenschappengroep. Hier volgt een voorbeeld van het inschakelen TRACE voor zowel Debug Release configuraties als configuraties DEBUG Debug .

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

Wanneer u deze gebruikt wanneer u Trace niet bent gekoppeld aan het foutopsporingsprogramma, moet u een traceringslistener, zoals dotnet-trace, configureren.

Voorwaardelijke tracering

Naast eenvoudige Write en WriteLine methoden is er ook de mogelijkheid om voorwaarden toe te voegen met WriteIf en WriteLineIf. De volgende logica controleert bijvoorbeeld of het aantal nul is en schrijft vervolgens een foutopsporingsbericht:

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

U kunt dit herschrijven in één regel code:

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

U kunt deze voorwaarden ook gebruiken met Trace en met vlaggen die u in uw toepassing definieert:

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

Controleren of bepaalde voorwaarden bestaan

Een assertie, of Assert instructie, test een voorwaarde die u opgeeft als argument voor de Assert instructie. Als de voorwaarde wordt geëvalueerd true, treedt er geen actie op. Als de voorwaarde wordt geëvalueerd false, mislukt de assertie. Als u met een foutopsporingsbuild werkt, wordt de onderbrekingsmodus van uw programma geactiveerd.

U kunt de Assert methode gebruiken vanuit Debug of Trace, die zich in de System.Diagnostics naamruimte bevinden. Debug klassemethoden zijn niet opgenomen in een releaseversie van uw programma, zodat ze de grootte niet vergroten of de snelheid van uw releasecode verminderen.

Gebruik de System.Diagnostics.Debug.Assert methode vrij om voorwaarden te testen die waar moeten zijn als uw code juist is. Stel dat u een functie voor het delen van gehele getallen hebt geschreven. Door de regels van wiskunde kan de deler nooit nul zijn. U kunt deze voorwaarde testen met behulp van een assertie:

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

    return dividend / divisor;
}

Wanneer u deze code uitvoert onder het foutopsporingsprogramma, wordt de assertie-instructie geëvalueerd. De vergelijking wordt echter niet gemaakt in de releaseversie, dus er is geen extra overhead.

Notitie

Wanneer u deze gebruikt System.Diagnostics.Debug.Assert, moet u ervoor zorgen dat de Assert resultaten van het programma niet worden gewijzigd als Assert wordt verwijderd. Anders kunt u per ongeluk een fout introduceren die alleen wordt weergegeven in de releaseversie van uw programma. Wees vooral voorzichtig met asserties die functie- of procedure-aanroepen bevatten.

Het gebruik Debug en Trace van de System.Diagnostics naamruimte is een uitstekende manier om extra context te bieden wanneer u uw toepassing uitvoert en fouten opssport.