Как использовать общую ссылку log4net в сборках, загружаемых во время выполнения?

У меня есть однопоточное приложение, которое загружает несколько сборок во время выполнения, используя следующее:

objDLL = Assembly.LoadFrom(strDLLs[i]);

Я хотел бы, чтобы сборки, загруженные таким образом, использовали ту же ссылку на log4net.ILog, что и остальные сборки. Но похоже, что загруженные сборки среды выполнения имеют совсем другую ссылку и нуждаются в собственной конфигурации. Кто-нибудь знает, можно ли использовать один log4net.ILog для сборок, загружаемых во время выполнения с использованием интерфейса .NET?

Вот код создания и поддержки log4net.ILog в классе Program:

   // Configure log4net using the .config file
   [assembly: log4net.Config.XmlConfigurator(Watch = true)]

   public static class Program
   {
      private static log4net.ILog m_Log = null;

      [STAThread]
      public static void Main(string[] args)
      {
         try
         {
            m_Log = log4net.LogManager.GetLogger(
               MethodBase.GetCurrentMethod().DeclaringType);
         }

      }
   }

Зачем вам нужно, чтобы все они имели один и тот же ILog? У вас может быть один ILog для каждого класса, и все они по умолчанию регистрируются в корневом регистраторе.

Matt Howells 26.09.2008 01:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
1
2 902
5

Ответы 5

Если все ваши сборки реализуют общий интерфейс, тогда у вас может быть параметр свойства или конструктора, который позволяет передавать ваш локальный экземпляр ILog динамически загружаемым сборкам.

Что-то в загруженном классе среды выполнения мешает работе обычного одного ILog для каждого класса. Я могу получить действительный экземпляр ILog, но, в отличие от всех других экземпляров, он, похоже, не настроен (все флаги Is ** Enabled установлены в значение false). Возможно, "корневой" логгер недоступен для классов, загружаемых во время выполнения ???

Вы можете получить тот же регистратор, указав буквальную строку имени регистратора, получив таким образом тот же экземпляр регистратора.

log4net.LogManager.GetLogger("SomeLogger");

У меня глупое решение. Вы можете установить XmlConfiguration в основной файл конфигурации log4net.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "<configpath>",Watch = true)]

Это не совсем красота .. но работает.

Этот ответ пришел с опозданием на 4 года, но я столкнулся с той же проблемой. В моем случае я обнаружил, что загружаемая сборка (из другой папки, чем вызывающая сборка) также загружала свой собственный экземпляр log4net.

Я исправил проблему, удалив файл log4net.dll из папки, в которую загружалась сборка среды выполнения.

МОЙ БОГ ! Это решило мою проблему, когда регистрация в динамически загружаемых сборках никогда не работала, тогда как она работала нормально, когда сборки находились в ссылке в проекте.

Olivier MATROT 18.09.2015 15:45

Другие вопросы по теме