2014-07-01 11 views
5

Come definire un TraceListener predefinito, che viene automaticamente aggiunto a tutte le TraceSources, in un progetto net 4.0 C#?Aggiungere un TraceListener predefinito per tutte le TraceSources in App.config

Attualmente ho elencare ogni TraceSource nome che uso nel file App.config in questo modo:

<system.diagnostics> 
    <sharedListeners> 
     <add name="MyListener" type="MyListenerType,MyAssemblyName" /> 
    </sharedListeners> 
    <sources> 
     <source name="Class1" switchValue="All"> 
     <listeners><add name="MyListener"></add></listeners> 
     </source> 
     <source name="Class2" switchValue="All"> 
     <listeners><add name="MyListener"></add></listeners> 
     </source> 
     <source name="Class3" switchValue="All"> 
     <listeners><add name="MyListener"></add></listeners> 
     </source> 
     ... repeat for a gazillion classes ... 
    </sources> 
    <system.diagnostics> 

Sto usando uno SharedListener che dovrebbe ricevere tutte le uscite da tutti i TraceSources, se non diversamente specificato. Con la sintassi sopra, questo richiede una voce manuale per ogni TraceSource.

Ogni volta che introduco una nuova classe con una nuova TraceSource, devo aggiornare App.Config. Se più programmi utilizzano quell'assembly, devo aggiornare più App.Config. Un errore di ortografia durante l'aggiornamento di queste voci non produrrà alcun errore, ma ometterà silenziosamente tutto l'output di traccia dalla sorgente corretta.

C'è un modo per impostare un TraceListener predefinito tramite App.config, in modo tale che devo solo assegnare un nome specifico a TraceSources se voglio deviare dal valore predefinito?

risposta

1

È possibile aggiungere un listener predefinito nella configurazione macchina, ma ciò influirebbe su più app di quelle che si desidera influenzare.

+0

I * do * ha ascoltatori condivisi. Il Listener 'MyListener' nel mio esempio è un listener condiviso, altrimenti non potrei farvi riferimento per nome quando lo aggiungo. (Cercherò di renderlo più chiaro nella domanda). Ma con la configurazione corrente, ho ancora bisogno di aggiungere questo listener condiviso a * ogni singolo TraceSource *. Sto cercando un modo per evitare di ripetere ogni nome di TraceSource in App.Config, rischiando di perdere o di sbagliare uno. – HugoRune

+0

Siamo spiacenti. Quindi è necessario modificare machine.config o farlo in codice all'avvio dell'applicazione, ma è necessario riflettere per ottenere l'elenco privato delle fonti di traccia per aggiungere tutti gli ascoltatori. – MatthewMartin

3

Non ho trovato un'ottima soluzione a questo, quindi quello che ho fatto è stato almeno centralizzare la creazione di TraceSources. Poi posso aggiungere qualsiasi degli ascoltatori traccia 'in app.config a queste fonti di nuova creazione:

TraceSource toReturn = new TraceSource(name, filterLevel); 

//remove the default trace listener; don't 'clear' the listeners entirely, because that would undo changes made in app.config; this is a decent compromise 
toReturn.Listeners.Remove("Default"); 

//add all global trace listeners from the app.config 
toReturn.Listeners.AddRange(Trace.Listeners); 

return toReturn; 

Ora saranno aggiunti tutti i listener aggiungo a <system.diagnostics> \ <trace> \ <listeners> a tutte le origini di analisi che creo con questo codice.

Problemi correlati