Mam rozwiązanie składające się z głównej aplikacji WinForm, z powiązanymi wewnętrznie napisanymi bibliotekami DLL klasy, z których chcę się logować. Rejestrowanie powinno być wykonywane przez ten sam program rejestrujący, niezależnie od tego, czy jest to główny klient UI lub powiązane z nim dll. Biblioteki DLL mogą oczywiście być używane przez inne aplikacje, które mają różne rejestratory w innych rozwiązaniach, ale w tych okolicznościach będą miały inną konfigurację log4net i być może inny zestaw dopełniaczy.Jaki jest najlepszy wzorzec do używania tego samego rejestratora Log4net w wielu złożeniach w rozwiązaniu?
Jednym z podejść byłoby utworzenie singletonu w głównej aplikacji i zalogowanie się z niego, jednak ponieważ log4net jest jego własnym singletonem, do którego można się odwoływać, o ile przekazujemy ten sam ciąg (lub typ) do log4net.LogManager.GetLogger
będziemy logować się do tego samego miejsca docelowego (w moim przypadku chcę użyć RollingFileAppender).
To działa. Jednak biorąc pod uwagę, że biblioteka DLL będzie miała kilka klas, oznaczałoby to, że każda instancja klasy lub klasa statyczna, z której chcemy się logować, wymagały i) argumentu definiującego nazwę rejestratora (w celu zalogowania się do tego samego miejsca docelowego) i ii) w każdym punkcie wejścia trzeba zadzwonić pod numer log4net.LogManager.GetLogger(loggerName)
.
Jaki jest najlepszy wzór do zastosowania? Czy właściwym podejściem byłoby stworzenie pojedynczej instancji w każdym zespole? Moją obawą jest to, że nadal będziemy musieli przekazać nazwę rejestratora do każdego punktu wejścia dla biblioteki dll, co wydaje się przesadą. Aby uniknąć podania nazwy rejestratora, mogę założyć, że zawsze jest równa System.Reflection.Assembly.GetCallingAssembly().GetName().Name
.
Jeśli jest to zbyt trudne dla log4net, czy istnieją inne łatwiejsze rozwiązania, takie jak blok logowań Enterprise? A może najlepszym rozwiązaniem jest podejście zorientowane na aspekt (AOP)?
Reference for anti-pattern approach for singleton here.
W moim pierwotnym pytaniu zdecydowałem, że wiele z tego, co chciałem zarchiwizować, to w rzeczywistości informacja o postępie, więc opublikowaliśmy wydarzenia, które pochłonęły główną aplikację, ale twoje wyjaśnienie jest zdecydowanie najbardziej oczywiste i użyłem tego również gdzie indziej. – Topdown
Czytam to 6 lat później, więc nie, nigdy nie jest za późno! :-) – nashwan