2013-03-21 14 views
5

Mam mój Logging skonfigurowany do korzystania z innego TraceSource dla każdego Class.System.Diagnostics Traces wildcard dla nazwy źródła

Czy można skonfigurować wieloznacznik, który zapisuje zdarzenia dla wszystkich źródeł?

<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> 

Odpowiedz

4

Nie jestem świadomy wbudowanego sposobu, aby zrobić to automatycznie. Jednakże, jeśli spojrzysz na TraceLogger w repozytorium git Castle, zobaczysz, że zasadniczo zawijali i rozszerzali TraceSource, aby obsługiwać nazewnictwo "hierarichalne".

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

chciałbym skopiować kod tutaj, ale to może nie być właściwe tylko wyciąć i wkleić tam kod do SO.

mogę wyjaśnić, w jaki sposób idee przedstawione w klasie mógłby pracować dla (bez konieczności korzystania zamek)

W istocie, w kodzie klienta (który chce się zalogować rzeczy), należy utworzyć instancję twojego "rejestratora" (zamiast TraceSource). Jako dane wejściowe do rejestratora podajesz na przykład w pełni kwalifikowaną nazwę klasy. Wewnątrz konstruktora użyj nazwy wejściowej, aby spróbować rozwiązać TraceSource. Jeśli istnieje TraceSource skonfigurowany z tą nazwą, użyj tego TraceSource do wykonania pracy. Jeśli nie, przytnij prawą część pełnej nazwy. Spróbuj rozwiązać TraceSource o tej nazwie. Jeśli istnieje TraceSource skonfigurowany z tą nazwą, użyj go. I tak dalej. Jeśli nie znajdziesz żadnych TraceSources, nie rejestruj niczego z "logger". Można dodać zdolność rozpoznawania źródła TraceSource skonfigurowanego z nazwą wieloznaczną (""). Jeśli nigdy nie znajdziesz TraceSource przy użyciu techniki przycinania nazw i jeśli istnieje "TraceSource", użyj "*" TraceSource jako zastępczego.

Więc może masz coś takiego:

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. 

} 

I rzeczywiście zrobić coś takiego się w ramach prototypu (że skończyło się nie używa) i to działało bardzo dobrze dla naśladując drogę możesz określić rejestratory w log4net i NLog.

Powodzenia!

+0

Dzięki tej odpowiedzi jest niesamowita. Zrobiłem już prawie to samo, co sugerowałeś. Dałem loggerowi pełne imię klasy i próbowałem rozwiązać montaż. Następnie użyłem nazwy zespołu jako źródła dziennika. (Miałem różne źródła dla wszystkich skonfigurowanych zestawów). Ale nigdy nie myślałem o zrobieniu własnego źródła wieloznacznego. Myślę również, że twój sposób rozwiązywania problemów ma większą elastyczność i jest prawdopodobnie szybszy. Dzięki nie będzie mi trudno to zaimplementować, bardzo przydatny! –