1

在我的应用程序中,我使用Common.Logging库来抽象日志记录功能。在启动程序集中,它被配置(在app.config文件中)以针对Log4Net库工作。建立了一些 Appender:ConsoleAppender, RollingFileAppender, TraceAppender. 在单曲中一切正常AppDomain。但是我发现日志记录在新创建的AppDomain. IE:

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.LoggingAPI(即LogManager.Reset()方法),但它不能解决问题。

如何强制Common.Logging / Log4Net在新创建的中正常工作AppDomain?请寻求帮助。

4

2 回答 2

1

从您显示的代码来看,您似乎没有为您的应用程序域提供配置文件。自从我这样做以来已经有几年了,但如果我没记错的话,新应用程序域的配置文件默认为空。

下面是如何使用 AppDomainSetup 类的示例:

AppDomainSetup ads = new AppDomainSetup();

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

(代码示例归功于 Tom Overton。)

有关他对此问题的解释,请参阅http://social.msdn.microsoft.com/Forums/vstudio/en-US/a23ff0ad-8a4c-4aaf-8281-dcc7e840f8a5/assigning-appconfig-to-appdomain?forum=clr

于 2014-07-24T17:25:34.637 回答
1

我对 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);
于 2016-11-11T08:49:37.423 回答