2013-03-21 18 views
5

Ho il mio Logging impostato per utilizzare un diverso TraceSource per ogni Class.System.Diagnostics Traccia carattere jolly per il nome sorgente

È possibile configurare un carattere jolly che scrive eventi per tutte le origini?

<system.diagnostics> 
    <sources> 
    <source name ="wildcard" switchValue="Warning"> 
     <listeners> 
     <add name="textlog" /> 
     </listeners> 
    </source> 
    <source name="MySpecificClass" switchValue="All"> 
     <listeners> 
     <add name="textlog" /> 
     </listeners> 
    </source> 
    </sources> 
    <sharedListeners> 
    <add name="textlog" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="Log.log"> 
    </add> 
    </sharedListeners> 
    <trace autoflush="true"/> 
</system.diagnostics> 

risposta

4

Non sono a conoscenza di un modo integrato per farlo automaticamente. Tuttavia, se si dà un'occhiata a TraceLogger nel repository git di Castle, si può vedere che hanno essenzialmente un wrapper esteso ed esteso per supportare la denominazione "hierarichal".

https://github.com/castleproject/Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs

vorrei copiare il codice qui, ma potrebbe non essere adeguato per tagliare e incollare solo lì codice in SO.

posso spiegare come le idee presentate nella classe potrebbero lavorare per la vostra (senza dover utilizzare Castello)

In sostanza, nel codice cliente (che vuole accedere roba), si potrebbe creare un'istanza del tuo "logger" (piuttosto che TraceSource). Come input per il logger, si darebbe, ad esempio, il nome completo della classe. All'interno del costruttore, utilizzare il nome di input per provare a risolvere un TraceSource. Se c'è una TraceSource configurata con quel nome, usa quella TraceSource per fare il lavoro. In caso contrario, ritaglia la parte più a destra del nome completo. Prova a risolvere una TraceSource con quel nome. Se c'è una TraceSource configurata con quel nome, usala. E così via. Se non trovi TraceSources, non registrare nulla dal tuo "logger". È possibile aggiungere la possibilità di riconoscere un TraceSource che è stato configurato con un nome jolly (""). Se non si trova mai una TraceSource usando la tecnica del taglio del nome e se esiste una "TraceSource", utilizzare "*" TraceSource come fallback.

Quindi, si potrebbe avere qualcosa di simile:

class MyTraceSource 
{ 
    private TraceSource ts; 

    public MyTraceSource(string name) 
    { 
    ResolveTraceSource(name); 
    } 

    private void ResolveTraceSource(string name) 
    { 
    //Check for a configured TraceSource from most qualified name (as input) to least qualified (""). 
    //Assume name like this: Namespace1:Namespace2:Class 
    //Try to resolve: 
    // TraceSource("Namespace1.Namespace2.Class"); 
    // TraceSource("Namespace1.Namespace2"); 
    // TraceSource("Namespace1"); 
    //If you still haven't found one, try to resolve 
    // TraceSource("*"); 
    } 

    //Implement either TraceSource API, or whatever API you prefer for logging. 

} 

ho effettivamente fatto qualcosa di simile me stesso come parte di un prototipo (che abbiamo finito per non usare) e ha funzionato abbastanza bene per imitare il modo in cui che è possibile specificare i logger in log4net e NLog.

Buona fortuna!

+0

Grazie questa risposta è eccezionale. Ho già fatto quasi la stessa cosa che hai suggerito. Ho dato al logger il nome completo della classe e ho provato a risolvere l'assembly. Quindi ho usato il nome dell'assembly come origine log. (Quindi ho avuto diverse fonti per tutti i miei assemblies impostati). Ma non ho mai pensato di creare la mia fonte jolly. Inoltre, penso che il tuo modo di risolvere abbia più flessibilità e sia probabilmente più veloce. Grazie non sarà difficile per me implementarlo, molto utile! –

Problemi correlati