2015-03-03 13 views
8

Ok, non ridere. Nel 2005 ho letto del tracciamento usando lo spazio dei nomi System.Diagnostics, è stato complicato e da allora ho utilizzato log4net e NLog (e così pure tutti gli altri).Come accedere a livello dettagliato utilizzando `System.Diags ... Trace`

Oggi la mia app sarà ospitata su siti Web Windows Azure e utilizza il nostro vecchio amico, Trace. astrazioni

http://azure.microsoft.com/en-gb/documentation/articles/web-sites-enable-diagnostic-log/

con aria di sufficienza, ho sempre usato, CIO, quindi sono solo la scrittura di un nuovo piccolo spessore di scrivere utilizzando Trace ma ha solo TraceInformation, TraceWarning e TraceError.

Esistono alcuni metodi Write* ma non ho idea di dove finiranno e in quali circostanze. API orribile. [gags]

Quale metodo è per livello verbose/debug?

Modifica: rimosso "Facile" dal titolo. Chiaramente non lo è.

+0

credo che 'TraceInformation' è destinata ad essere per quello che si chiama verbose. –

+3

@ 500-InternalServerError no, 'Information' e' Verbose' sono due livelli diversi – Jcl

risposta

10

Quello che stai descrivendo è la classe System.Diagnostics.Trace, che ha alcuni metodi semplici per scrivere sull'output di traccia diagnostica.

Questo è lontano da quanto sia potente la diagnostica tracciamento sono in .NET

il modo più bello per fare tracing è quello di creare un TraceSource. In una classe TraceSource c'è una proprietà Switch che a sua volta ha una proprietà Level in cui si definiscono i livelli di verbosità desiderati per quello specifico TraceSource. Si può fare che TraceSource ascoltare tutti i livelli:

var ts = new TraceSource("My Verbose Debugger") {Switch = {Level = SourceLevels.All}}; 

Poi per tracciare qualcosa, si traccia a quella fonte, in cui si specifica il livello, in questo modo:

ts.TraceData(TraceEventType.Verbose, 0, dataToBeTraced); 

Il 0 è l'ID la traccia e dataToBeTraced è un oggetto con i dati specifici che si desidera tracciare (è un parametro params [] object, quindi è possibile passare in molti oggetti se lo si desidera).

Ora come utilizzare i dati? Usando uno TraceListener che aggiungi alla tua collezione ListenersTraceSource. Fate la propria classe derivanti da TraceListener e l'override del metodo TraceData, in questo modo:

class MyTraceListener : TraceListener 
{ 
    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, params object[] data) 
    { 
    base.TraceData(eventCache, source, eventType, id, data); 
    // do what you want with the objects in the "data" parameter 
    } 
} 

L'ascoltatore può essere condivisa tra molti tracesources, e sarà solo ricevere il livello di dati che è TraceSwitch livello consente.

System.Diagnostics.Trace utilizza un ascoltatore così (l'DefaultTraceListener) che viene aggiunto per impostazione predefinita sia Debug.Listeners e Trace.Listeners, ma internamente, funziona come descritto.

All'inizio tutto potrebbe sembrare un po 'confuso, ma è davvero potente, e una volta che hai un set di classi helper ... almeno io, ho smesso di usare librerie di logging di terze parti e lo uso in larga misura.

Per quanto riguarda Azure, questo è pura speculazione in quanto non ho mai fatto alcun Azure, ma credo che ci si configura il TraceSource come questo nella tua app.config (forse web.config? Non è sicuro su web), l'aggiunta di un default ascoltatore azzurro per il registro:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
    <sharedListeners> 
     <add name="AzureListener" type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> 
      <filter type="" /> 
     </add> 
    </sharedListeners>   
    <sources> 
     <source name="MyTraceSource" switchValue="Verbose" > 
     <listeners> 
      <add name="AzureListener" /> 
     </listeners> 
     </source> 
    </sources> 
</system.diagnostics> 
</configuration> 

"MyTraceSource" è il nome della stringa che hai dato il tuo yo TraceSource nel costruttore quando farlo tramite codice.

Oppure si può semplicemente creare un TraceSource in codice come sopra, e aggiungere un Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener alla sua collezione Listeners

+0

Questa è un'ottima risposta. Ho appena imparato la stessa roba stamattina riguardo a "TraceSource.TraceData | Event'. Ma è la configurazione che ha iniziato ad essere il prossimo mistero e la tua scoperta di 'Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener' potrebbe contenere la chiave. Grazie, aggiornerò più tardi. –

+0

Come detto, non ho fatto alcun Azure quindi sto speculando. Comunque sono stato interessato ad iniziare così ho delle informazioni googlate qua e là – Jcl

+0

Ho funzionato, senza la configurazione, quindi WAWS deve aggiungerlo. Se abilito la modifica tramite Monaco forse lo vedrò nel web.config. Ad ogni modo, ora passerò al livello di errore nella console di gestione e vedrò se le mie istruzioni 'WriteLine' vengono ignorate. In caso contrario, sostituirò il 'Trace' statico con' TraceSource' e vedrò se riesco a romperlo e magari ripararlo di nuovo con la configurazione. –

3

ho voluto aggiungere la mia storia.

La semplice risposta alla mia domanda è che Trace.WriteLine è effettivamente dettagliato. Tuttavia, la traccia .NET è potente ma complicata ma sono riuscita a farlo funzionare in Table Storage.

  • Nel portale Azure, accendere Application Logging (Storage Table) sotto la scheda Configurazione e configurare il tavolo. Se ne fai uno nuovo, non apparirà finché non salvi le modifiche.

  • Nell'applicazione, è necessario utilizzare solo i metodi su System.Diagnostics.Trace e WAWS imposterà automaticamente il listener richiesto.

Il mio scoglio ha tracciato messaggi fatali in modo appropriato. Dato che non esiste un metodo statico per i messaggi di livello critico, sono costretto a utilizzare i metodi su TraceSource e a passare l'enum di livello desiderato.

Per esempio, nella mia registrazione astrazione, il livello arriva come LoggingLevel.Fatal e ho bisogno di chiamare TraceSource.TraceEvent(TraceEventType.Critical, ...

Tuttavia, proprio Newing-up un TraceSource non fa nulla in quanto, come spiega Jcl, ha bisogno di un ascoltatore. È lì che sono bloccato.

var listener = (TraceListener)new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener(); 

_traceSource = new TraceSource(name, SourceLevels.All); 
_traceSource.Listeners.Add(listener); 

Questo bisogno di un riferimento alla Microsoft.WindowsAzure.Diagnostics nel SDK livello locale, ma stranamente non viene compilato.

Quel cast non funzionerà. Non dovrei nemmeno averne bisogno comunque.

errore 3 Impossibile convertire il tipo 'Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener' a 'System.Diagnostics.TraceListener' Evoq.AppName.CoreLib C: \ DATA \ codice \ AppName \ Evoq.AppName \ Evoq. AppName.CoreLib \ Strumentazione \ AzureApplicationDiagnosticsLogger.cs 30 28

parte strana è che la Redgate riflettore mostra una catena di ereditarietà in questo modo:

TraceListener, v4.0_4.0.0.0__b77a5c561934e089\System.dll 
RDEventMonitoringAgentListener, MonAgentListener.dll 
DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics.dll 

Se rEFLEC t mia classe TraceSource lì, la sua (anche) da:

v4.0_4.0.0.0__b77a5c561934e089\System.dll 

dispari.Mi sto arrendendo ora. Ho un prodotto da spedire. Tornerò a utilizzare la classe statica Trace e tornerò ad essa se inizia a costare.

Luca

+1

So che hai detto che hai rinunciato, ma controlla questo: http://cryclops.com/2013/09/stupid-simple-azure-logging-for-cloud-services/ Lo fanno aggiungendo il ' DiagnosticMonitorTraceListener' a un 'TraceSource' denominato aggiungendolo al file di configurazione, e sembra funzionare – Jcl

+0

Grazie per averlo trovato. Sei stato di grande aiuto –

+0

Sono contento di essere stato. Se ti capita di farlo funzionare alla fine, per favore condividi quando hai tempo ... come ho detto, ho intenzione di provare l'azzurro per alcune cose in futuro e potrebbe risparmiare qualche mal di testa :-) – Jcl

Problemi correlati