在我的应用程序中,我使用Common.Logging
库来抽象日志记录功能。在启动程序集中,它已配置(在app.config
文件中)以对Log4Net
库起作用。已经建立了一些Appender: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
中正常工作?请求帮助。
答案 0 :(得分: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的代码示例。)
答案 1 :(得分:0)
我对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);