У меня есть решение, состоящее из основного приложения winforms, с соответствующими внутренне написанными библиотеками библиотеки классов, из которых я хочу зарегистрироваться. Это ведение журнала должно выполняться одним и тем же журналом, независимо от того, вызывает ли этот основной клиент UI или связанные с ним DLL. Разумеется, библиотеки DLL могут использоваться другими приложениями, которые имеют разные регистраторы в других решениях, но в этих обстоятельствах будет иметь другую конфигурацию log4net и, возможно, совсем другой набор приложений.
Один из подходов заключался бы в создании Singleton в основном приложении и входе в него из журнала, однако, поскольку log4net является его собственным singleton, на который можно ссылаться, поскольку мы передаем одну и ту же строку (или тип) на log4net.LogManager.GetLogger
, мы будет регистрироваться в одном месте (в моем случае я хочу использовать RollingFileAppender).
Это работает. Однако, учитывая, что DLL будет иметь несколько классов, это означало бы, что каждый экземпляр класса или статический класс, из которого мы хотим регистрировать, потребует: i) аргумента, определяющего имя регистратора (для того, чтобы войти в тот же пункт назначения) и ii) в каждой точке входа необходимо вызвать log4net.LogManager.GetLogger(loggerName)
.
Каков наилучший образец для использования здесь? Будет ли правильный подход состоять в создании экземпляра singleton в каждой сборке? Меня беспокоит то, что нам все равно нужно передать имя регистратора в каждую точку входа для dll, что кажется излишним. Чтобы избежать перехода в имя регистратора, я мог бы предположить, что он всегда равен System.Reflection.Assembly.GetCallingAssembly().GetName().Name
.
Если это слишком сложно для log4net, существуют ли другие более простые решения, такие как блок регистрации предприятия? Или наилучшим решением является подход с аспектным программированием (AOP)?