Logger не работает во вновь созданном AppDomain

В моем приложении я использую Common.Logging библиотека, чтобы абстрагировать функциональность регистрации. При запуске сборка была настроена (в app.config файл) работать против Log4Net библиотека. Установлено несколько приложений: ConsoleAppender, RollingFileAppender, TraceAppender, Все отлично работает в сингле AppDomain, Однако я обнаружил, что регистрация не работает во вновь созданном AppDomain, то есть:

Logger.Info( "Logging works here" ); // Logging works here

var appDomain = AppDomain.CreateDomain(
                              "AppDomain." + componentHost.FullName,
                               AppDomain.CurrentDomain.Evidence,
                               AppDomain.CurrentDomain.SetupInformation );

var proxy = (IComponentHost) appDomain.CreateInstanceAndUnwrap(
                               componentHost.Assembly.FullName,
                               componentHost.FullName,
                               false,
                               BindingFlags.Default,
                               null,
                               new object[] { },
                               null,
                               null );

proxy.Init(); // Logging does not work in Init() method stack

Я пытаюсь найти решение, используя оба app.config конфигурация, а также Common.Logging API (т.е. LogManager.Reset() метод), но это не решает проблему.

Как я могу заставить Common.Logging / Log4Net правильно работать во вновь созданном AppDomain? Пожалуйста, за помощь.

2 ответа

У меня похожая проблема с log4net. Я использовал XmlConfigurator.Configure() без параметров, который использует Assembly.GetCallingAssembly() для получения файла конфигурации. Я заменил его на:

var configFile = new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
if (!configFile.Exists)
    throw new Exception($"Failed to find configuration file '{configFile.FullName}'");
XmlConfigurator.Configure(configFile);

Из кода, который вы показываете, похоже, что вы не предоставляете файл конфигурации для своего домена приложения. Прошло несколько лет с тех пор, как я это сделал, но, если я правильно помню, файл конфигурации для нового домена приложения по умолчанию пуст.

Вот пример того, как использовать класс AppDomainSetup:

AppDomainSetup ads = new AppDomainSetup();

ads.SetConfigurationBytes( Encoding.UTF8.GetBytes(
@"<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SqlServerCe.3.5"></remove>
  </DbProviderFactories>
</configuration>" ) ); 

(Благодарим Тома Овертона за образец кода.)

См. http://social.msdn.microsoft.com/Forums/vstudio/en-US/a23ff0ad-8a4c-4aaf-8281-dcc7e840f8a5/assigning-appconfig-to-appdomain?forum=clr для объяснения этой проблемы.

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