TraceListener e Trace in C#
Un esempio C# di come usare i TraceListener per scrivere i propri log applicativi.
Prima definisco dove voglio scrivere i log, in questo caso su file (MyFile.log), sull'output della console e sul log di windows:
L'output generato viene scritto su tutti i Listener definiti nel web.config. In questo caso l'output su console sarà simile a questo:
Mentre sul file MyFile.log verra scritto:
Infine l'output sul log Application di windows genera, per i primi tre casi, messaggi con level: Information, Warning ed Error. I successivi WriteLine vengono scritti con level Information. Tutti gli eventi hanno come source SourceTraceLog e la stringa di messaggio è scritta nel testo nell'evento.
Il vantaggio di questo approccio è che modifcando il web config, senza ricompilare, posso decidere dove vengono scritti i log.
La stessa cosa la posso fare via codice senza scrive niente nel web.config.
Vediamo un esempio con il System.Diagnostics.TextWriterTraceListener.
L'esempio permette di impostare dinamicamente il nome del file legando alla data odierna, cosa non possibile da web.config:
Avendo definito un solo Listener (a meno che non erano già presenti nel web.config), ho un output solo su file:
Prima definisco dove voglio scrivere i log, in questo caso su file (MyFile.log), sull'output della console e sul log di windows:
XML: web.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace autoflush="true" indentsize ="2">
<listeners>
<add name="File" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="DateTime" initializeData="MyFile.log" />
<add name="Console" type="System.Diagnostics.ConsoleTraceListener" traceOutputOptions="DateTime" />
<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="SourceTraceLog" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
Attenzione per scrivere sul log di windows (System.Diagnostics.EventLogTraceListener) bisogna avere adeguati privilegi
Successivamente da programma decido cosa scrivere:C#
using System;
using System.Diagnostics;
namespace Sgart
{
class Program
{
static void Main(string[] args)
{
string frmt = "Esempio di messaggio '{0}'";
Trace.TraceInformation(frmt, "Information");
Trace.TraceWarning(frmt, "Warning");
Trace.TraceError(frmt, "Error");
Trace.WriteLine(string.Format(frmt, "write line"));
Trace.WriteLine(string.Format(frmt, "write line con categoria"), "MyCategory");
}
}
}
Text
Sgart.vshost.exe Information: 0 : Esempio di messaggio 'Informatio
n'
DateTime=2010-05-12T22:45:35.6210069Z
Sgart.vshost.exe Warning: 0 : Esempio di messaggio 'Warning'
DateTime=2010-05-12T22:45:35.8397611Z
Sgart.vshost.exe Error: 0 : Esempio di messaggio 'Error'
DateTime=2010-05-12T22:45:35.8553864Z
Esempio di messaggio 'write line'
MyCategory: Esempio di messaggio 'write line con categoria'
Text
Sgart.vshost.exe Information: 0 : Esempio di messaggio 'Information'
DateTime=2010-05-12T22:45:35.6210069Z
Sgart.vshost.exe Warning: 0 : Esempio di messaggio 'Warning'
DateTime=2010-05-12T22:45:35.8397611Z
Sgart.vshost.exe Error: 0 : Esempio di messaggio 'Error'
DateTime=2010-05-12T22:45:35.8553864Z
Esempio di messaggio 'write line'
MyCategory: Esempio di messaggio 'write line con categoria'
Il vantaggio di questo approccio è che modifcando il web config, senza ricompilare, posso decidere dove vengono scritti i log.
La stessa cosa la posso fare via codice senza scrive niente nel web.config.
Vediamo un esempio con il System.Diagnostics.TextWriterTraceListener.
L'esempio permette di impostare dinamicamente il nome del file legando alla data odierna, cosa non possibile da web.config:
C#
using System;
using System.Diagnostics;
using System.IO;
namespace Sgart
{
class Program
{
static void Main(string[] args)
{
string frmt = "Esempio di messaggio '{0}'";
string fileName = string.Format("MyFile_{0:yyyyMMdd}.log", DateTime.Today);
//creo il Listener dinamicamente
TextWriterTraceListener wl = new TextWriterTraceListener(fileName);
wl.TraceOutputOptions = TraceOptions.DateTime;
//lo aggiungo ai Listener
Trace.Listeners.Add(wl);
//imposto autoflush, altrimenti devo invocare Trace.Flush() alla fine
Trace.AutoFlush = true;
//scrivo il messaggio
Trace.TraceInformation(frmt, "Information");
}
}
}
Text: MyFile_20100512.log
Sgart.vshost.exe Information: 0 : Esempio di messaggio 'Information'
DateTime=2010-05-12T23:21:37.4001966Z