2012-11-08 6 views
15

Il seguente codice:Formato di Tracing uscita in System.Diagnostics.TraceSource

static void Main(string[] args) 
{ 
    TraceSource ts = new TraceSource("MyApplication"); 

    ts.Switch = new SourceSwitch("MySwitch"); 
    ts.Switch.Level = SourceLevels.All; 

    ts.Listeners.Add(new TextWriterTraceListener(Console.Out)); 

    ts.TraceInformation("Hello World"); 
    Console.ReadKey(); 
} 

genera il seguente output:

MyApplication Informazioni: 0: Ciao Mondo

La parte "MyApplication Information: 0:" all'inizio dell'output di traccia proviene dalla classe TraceSource stessa.

Tuttavia, ho bisogno di avere un timestamp all'inizio della riga e vorrei anche cambiare "Informazioni" in "Informazioni".

C'è un modo per ottenere più libertà nel output di traccia in modo tale che posso configurarlo per essere come:

13:03:00 - MyApplication Info: Ciao Mondo

Ho provato per un paio d'ore, ma senza successo. Qualunque cosa io faccia, all'inizio della linea di output, c'è sempre questa costante predefinita "MyApplication Information: 0: Hello World".

La documentazione MSDN non ha rivelato alcuna informazione utile.

risposta

5

Impostare la proprietà TraceOutputOptions sul listener di traccia. Il formato è predefinito, ma puoi optare per le ulteriori parti di dati definite dall'enum TraceOptions.

+1

Provato, ma sembra non essere la soluzione. Con TraceOutputOptions, posso solo specificare quali ** ulteriori ** elementi voglio nel mio output. Ma in realtà voglio ** meno **! ;) – Flagg1980

+7

Crea il listener di traccia che eredita dal listener di writer di testo e sostituisce i metodi che eseguono la formattazione. Usa invece quel listener. – fsimonazzi

1

Forse un po 'tardi ma se si desidera una soluzione semplice e versatile si dovrebbe dare un'occhiata al progetto Essentials Diagnostics su CodePlex (disponibile anche through NuGet).

Definisce una vasta gamma di listener (con la formattazione personalizzata consentita) che viene inviata alla console, al testo scorrevole e ai file XML, registri eventi, e-mail, ecc. E viene fornita con esempi di configurazione.

3

TraceSource.TraceInformation termina chiamando TraceListener.TraceEvent su ogni listener che aggiunge nell'intestazione. Fortunatamente, TraceListener ha un metodo WriteLine che è possibile utilizzare per produrre output personalizzati.

static void Main(string[] args) 
{ 
    TraceSource ts = new TraceSource("MyApplication"); 

    ts.Switch = new SourceSwitch("MySwitch"); 
    ts.Switch.Level = SourceLevels.All; 

    ts.Listeners.Add(new TextWriterTraceListener(Console.Out)); 

    for (int i = 0; i < ts.Listeners.Count; i++) 
    { 
     var listener = ts.Listeners[i]; 

     listener.WriteLine(
      string.Format("{0} - {1} Info: {2}", 
      DateTime.Now.ToString("HH:mm:ss"), ts.Name, "Hello World")); 
     listener.Flush(); 
    } 
    Console.ReadKey(); 
} 

uscita:

13:52:05 - MyApplication Info: Ciao Mondo

4

Venendo in ritardo anche, ma nel caso in cui qualcun altro terre qui ...

Mi piace mantenerlo semplice. Io uso un metodo Trace statico all'interno del mio App.cs che si lega a una singola TraceSource che creo all'avvio. Questo mi permette di accedervi attraverso la mia app e mantenere semplice app.config:

public static void Trace(TraceEventType eventType, string message) 
{ 
    if (_TraceSource.Switch.ShouldTrace(eventType)) 
    { 
     string tracemessage = string.Format("{0}\t[{1}]\t{2}", DateTime.Now.ToString("MM/dd/yy HH:mm:ss"), eventType, message); 
     foreach (TraceListener listener in _TraceSource.Listeners) 
     { 
      listener.WriteLine(tracemessage); 
      listener.Flush(); 
     } 
    } 
} 

La mia app.voci di configurazione:

<system.diagnostics> 
    <sources> 
     <source name="mytracesource" switchValue="All"> 
     <listeners> 
      <add name="mytracelistener" 
       type="System.Diagnostics.TextWriterTraceListener" 
       initializeData="trace.log"> 
      </add> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics>