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