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:

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");
    }
  }
}
L'output generato viene scritto su tutti i Listener definiti nel web.config. In questo caso l'output su console sarà simile a questo:

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'
Mentre sul file MyFile.log verra scritto:

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'
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:

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");
    }
  }
}
Avendo definito un solo Listener (a meno che non erano già presenti nel web.config), ho un output solo su file:

Text: MyFile_20100512.log

Sgart.vshost.exe Information: 0 : Esempio di messaggio 'Information'
    DateTime=2010-05-12T23:21:37.4001966Z
Tags:
C#237 Esempi225
Potrebbe interessarti anche: