De XML Writer Trace Listener

  1. Inleiding
  2. Interpolated strings
  3. XML Writer Trace Listener
  4. Output
  5. Slot
  6. Voorbeeldprogramma

Inleiding

Het C# programma ‘doet het niet’. Een melding verschijnt op het scherm en de gebruiker klikt de melding weg. Met trace listeners hebben we een gewillig oor waarin niets verloren gaat en deze post behandelt de XML Writer Trace Listener, een trace listener dat alles wegschrijft naar een bestand in XML formaat.

In een eerdere post over debuggen kwamen trace listeners al ter sprake. We kunnen voor de gemoedsrust van de gebruiker ervoor kiezen om bij foutmeldingen alleen maar een gebruikersvriendelijke boodschap op het scherm te tonen waarbij een trace listener de foutboodschap afvangt en in een bestand of een ander medium zet. C# biedt een ruime keus aan te gebruiken trace listeners. We behandelen in deze post de XMLWriterTraceListener. Een trace listener dat alles wegschrijft naar een bestand in XML formaat.

up | down

Interpolated strings

We doen een deling in de try en we gaan delen door nul. We gebruiken in dit voorbeeld interpolated strings en die strings zijn te herkennen aan de $ en de {}. Interpolated strings werden in C# versie 6 geïntroduceerd en zijn vanaf die versie te gebruiken.

int teller = 10;
int noemer = 5;
int uitkomst = 0;

try
{
 // De deling
 uitkomst = teller / noemer;
 
 // interpolated string
 Console.WriteLine(
 $"{teller} / {noemer} = {uitkomst}");
  
 // Gezien?
 Console.WriteLine(
 "Gezien? Hit any key to continue...");
 Console.ReadKey();
}

Dit is het resultaat als we delen door 5. Alles gaat gewoon goed en er komen geen foutmeldingen.

Maar wat als we proberen te delen door nul? Het programma zal met een foutmelding komen want het is niet mogelijk door nul te delen (“delen door nul is flauwekul“).

up | down

XML Writer Trace Listener

Als het fout gaat dan vangen we in de exception handler de foutmelding af met een XML Writer Trace Listener waarbij we op het scherm een gebruikersvriendelijke melding tonen:

catch (Exception ex)
{
 // Verbatim string
 string Pad = 
 @"C:\Logging\";
 
 // Gewone string
 string Jaar = 
 DateTime.Now.Year.ToString();

 // Nodig voor het genereren van
 // de naam van het logbestand 
 string Maand = 
 String.Format("{00:00}", DateTime.Now.Month);
 string Dag = 
 String.Format("{00:00}", DateTime.Now.Day);      
 string Uur = 
 String.Format("{00:00}", DateTime.Now.Hour);
 string Minuut =
 String.Format("{00:00}", DateTime.Now.Minute);
 string Seconde = 
 String.Format("{00:00}", DateTime.Now.Second);
 
 // interpolated string
 string XMLBestand = 
 $"{Pad}{Jaar}{Maand}{Dag}{Uur}{Minuut}{Seconde}.xml";

 // XmlWriterTraceListener
 using (XmlWriterTraceListener log = 
 new XmlWriterTraceListener($"{XMLBestand}"))
 {
   log.TraceEvent(
       new TraceEventCache(),
       $"{teller}/{noemer} geeft foutmelding '{ex.Message}'",
       TraceEventType.Error, 
       ex.HResult);
   log.Flush();
 }

 // Op scherm
 Console.WriteLine(
 "Iets gaat fout.\r\n");
 Console.WriteLine(
 $"Laat uw IT'er kijken naar bestand:\r\n{XMLBestand}\r\n");
 Console.WriteLine(
 "Gezien? Hit any key to continue...");
 Console.ReadKey();
}

up | down

Output

De gebruiker krijgt alleen deze melding te zien als we de waarde van de noemer wijzigen naar nul en door nul proberen te delen:

En voor de IT’er is er een logbestand 20200620141004.xml in folder C:\Logging. Het logbestand is een xml-bestand en de naam is gegenereerd uit de datum en de tijd waarop de foutmelding optrad. We hebben in dit voorbeeld de locatie van het logbestand ‘hard’ geprogrammeerd, maar de locatie kan ook uit een configuratiebestand gehaald worden.

Click to enlarge…

up | down

Slot

We hebben met de XML Writer Trace Listener een foutmelding in een XML-bestand gezet, maar er kan meer diagnostische informatie in het XML-bestand gezet worden. We hebben op die manier in ieder geval iets waarmee we de issue gericht kunnen oppakken want het gaat niet lukken met gesprekken zoals deze:

Hij doet het niet! Wat niet? Nou, dat hij het niet doet en hij gaf een error maar die heb ik weggeklikt, maar ik kan niet verder en het moet nu opgelost worden!

En je hebt een posting gelezen over de XML Writer Trace Listener. Ik hoop dat je er wat aan hebt gehad. Wil je weten wat ik nog meer over C# heb geschreven? Hit the C# button…

up | down


Voorbeeldprogramma

using System;
using System.Diagnostics;

namespace XMLWriterTraceListenerVoorbeeld
{
 class Program
 {
  static void Main(string[] args)
  {
   int teller = 10;
   int noemer = 0;
   int uitkomst = 0;

   try
   {
    // De deling
    uitkomst = teller / noemer;

    // interpolated string
    Console.WriteLine($"{teller} / {noemer} = {uitkomst}");

    // Gezien?
    Console.WriteLine("Gezien? Hit any key to continue...");
    Console.ReadKey();
   }
   catch (Exception ex)
   {
    // Verbatim string
    string Pad = 
    @"C:\Logging\";

    // Gewone string
    string Jaar = 
    DateTime.Now.Year.ToString();

    // Nodig voor het genereren van
    // de naam van het logbestand 
    string Maand = 
    String.Format("{00:00}", DateTime.Now.Month);
    string Dag = 
    String.Format("{00:00}", DateTime.Now.Day);      
    string Uur = 
    String.Format("{00:00}", DateTime.Now.Hour);
    string Minuut =
    String.Format("{00:00}", DateTime.Now.Minute);
    string Seconde = 
    String.Format("{00:00}", DateTime.Now.Second);

    // interpolated string
    string XMLBestand = 
    $"{Pad}{Jaar}{Maand}{Dag}{Uur}{Minuut}{Seconde}.xml";

    // XmlWriterTraceListener
    using (XmlWriterTraceListener log = 
    new XmlWriterTraceListener($"{XMLBestand}"))
    {
      log.TraceEvent(
      new TraceEventCache(),
         $"{teller}/{noemer} geeft foutmelding '{ex.Message}'",
         TraceEventType.Error, 
         ex.HResult);
      log.Flush();
    }

    // Op scherm
    Console.WriteLine(
    "Iets gaat fout.\r\n");
    Console.WriteLine(
    $"Laat uw IT'er kijken naar bestand:\r\n{XMLBestand}\r\n");
    Console.WriteLine(
    "Gezien? Hit any key to continue...");
    Console.ReadKey();
   }
  }
 }
}

up

Laat een reactie achter

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *