2009-07-23 12 views
14

Sto utilizzando TextWriterTraceListener per registrare i messaggi di diagnostica in un file di testo. Tuttavia, non dovrei nemmeno registrare un timestamp di ogni messaggio di traccia aggiunto. È possibile definire un tipo di formattatore per l'ascoltatore che aggiunga automaticamente data/ora?Formattazione dell'output di traccia

Attualmente sto aggiungendo i timestamp manualmente su ogni chiamata Trace.WriteLine() ma questo non è molto comodo.

risposta

15

Suggerisco di utilizzare invece Log4Net, che ha molta più personalizzazione.

In alternativa è possibile scrivere la propria implementazione TraceListener che inserisce le marche temporali per voi. È possono anche essere in grado solo derivare da TextWriterTraceListener e ignorare Write e WriteLine:

public override void Write(string x) 
{ 
    // Use whatever format you want here... 
    base.Write(string.Format("{0:r}: {1}", DateTime.UtcNow, x)); 
} 

public override void WriteLine(string x) 
{ 
    // Use whatever format you want here... 
    base.WriteLine(string.Format("{0:r}: {1}", DateTime.UtcNow, x)); 
} 
1

si potrebbe scrivere la propria sottoclasse TextWriterTraceListener che sostituisce i metodi WriteLine, decora la linea, e quindi passa la corda decorato alla base implementazione di classe per fare l'output effettivo.

-1

Non è davvero una risposta alla tua domanda, ma hai considerato solo l'uso di log4Net?

È possibile configurarlo per aggiungere ore, ecc. Insieme a una grande quantità di altre utili funzionalità.

1

O semplicemente aggiungere "DateTime" come traceOutputOption.

+4

Come scritto su http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.traceoutputoptions.aspx questo parametro non è utilizzato da 'Write' e metodi' WriteLine' di ' TextWriterTraceListener' che lo rende inutile nel mio caso – RaYell

0

Anche se questo è vecchio e una risposta è stata accettata, aggiungerò un'altra opzione. È possibile utilizzare l'addon Ukadc.Diagnostics da codeplex. Tra le altre cose, consente di definire una formattazione personalizzata, simile alla formattazione che è possibile definire con log4net e NLog. È una dipendenza solo per la configurazione. Cioè, si configura l'uso di Ukadc.Diagnostics attraverso il file app.config. Non ci sono dipendenze di origine (si continua a effettuare il login tramite System.Diagnostics non tramite un'API speciale). Detto questo, ci sono alcune limitazioni che si dovrebbe essere a conoscenza di:

  1. Le opzioni di formattazione attualmente implementate in Ukadc.Diagnostics realmente funzionare correttamente solo quando si accede con TraceSources. Quando si esegue il login con Trace.Write e Trace.WriteLine, l'oggetto TraceEventCache non viene compilato ed è qui che la maggior parte degli oggetti di formattazione riceve le informazioni.

  2. È necessario utilizzare un TraceListener Ukadc.Diagnostics (o un listener personalizzato derivato dal TraceListener di Ukadc.Diagnostics) per visualizzare la formattazione personalizzata nell'output. Se hai trovato un nuovo file di rolling super duper, TraceListener, dovrai lavorare un po 'per usarlo in combinazione con la formattazione di Ukadc.Diagnostics. Questo potrebbe essere difficile come reimplementare l'ascoltatore in termini di base TraceListener di Ukadc.Diagnostics. Oppure potrebbe essere più semplice, se si potesse semplicemente creare un nuovo TraceListener basato su Ukadc.Diagnostics che contenga il super-duplicazione di TraceListener, formatta i messaggi per Ukadc.Diagnostics e quindi deleghi ai metodi Write/WriteLine del listener contenuto.

12

Recentemente ho incontrato situazione simile e sembra che ora abbiamo uno strumento molto adatto per il compito, vale a dire Essential Diagnostics. Si imposta un listener in app.config come nel codice sottostante e quindi si inserisce semplicemente Essential.Diagnostics.dll nella stessa cartella.NON È RICHIESTA LA RICOSTRUZIONE. È possibile utilizzare questo con qualsiasi applicazione che utilizza System.Diagnostics per la traccia, anche se non si possiede la fonte. Non è meraviglioso?

<sharedListeners> 
    <add name="rollingfile" 
    type="Essential.Diagnostics.RollingFileTraceListener, Essential.Diagnostics" 
    initializeData="{ApplicationName}-{DateTime:yyyy-MM-dd}.log" 
    convertWriteToEvent="true" 
    template="{DateTime:yyyy-MM-dd HH:mm:ss.fff} {Message}{Data}" 
    /> 
</sharedListeners> 
+0

Il modo più semplice per installarlo è tramite NuGet: Install-Package Essential.Diagnostics.RollingFileTraceListener (Nota: io sono il manutentore di Essential.Diagnostics) –

+0

Inoltre, ho pensato di puntare l'impostazione "convertWriteToEvent" convertirà Write e WriteLine a tracciare gli eventi, in modo da ottenere anche un timestamp. (Sebbene sia probabilmente preferibile utilizzare TraceSource anziché i metodi statici su Trace.) –

+0

Essential Diagnostics è stato spostato da codeplex a github. Link di aggiornamento per favore: https://github.com/sgryphon/essential-diagnostics – dimaaan