De XML Writer Trace Listener
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.
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“).
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();
}
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.
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…
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();
}
}
}
}