Хотя вопрос несколько лет - может быть, это поможет кому-то:
можно использовать регистраторы, настроенные в родительском домене приложения. Что нужно сделать, так это маршрут LoggingEvent
s от дочернего AppDomain к родительскому домену AppDomain. Для этого нужно создать пользовательский Appender, которая перенаправляет запись из домена ребенка ...
/// <summary>
/// Represents an <see cref="IAppender"/> implementation that forwards a <see cref="LoggingEvent"/> to a given Receiver.
/// Instances of this class should be created in the child domain.
/// </summary>
public class CrossDomainOutboundAppender : AppenderSkeleton
{
private readonly CrossDomainParentAppender crossDomainParentAppender;
public CrossDomainOutboundAppender(CrossDomainParentAppender crossDomainParentAppender)
{
if (crossDomainParentAppender == null)
{
throw new ArgumentNullException("crossDomainParentAppender");
}
this.crossDomainParentAppender = crossDomainParentAppender;
}
protected override void Append(LoggingEvent loggingEvent)
{
LoggingEvent copied = new LoggingEvent(loggingEvent.GetLoggingEventData());
crossDomainParentAppender.Append(copied);
}
}
, пользовательский класс, который принимает пересылаемую LoggingEvent и присоединяет их к имеющимся IAppender
с ...
/// <summary>
/// Represents a Receiver that sends Log4Nets <see cref="LoggingEvent"/> to all available <see cref="IAppender"/>s.
/// Instances of this class should be created in the ParentDomain.
/// </summary>
[Serializable]
public class CrossDomainParentAppender : MarshalByRefObject
{
public void Append(LoggingEvent loggingEvent)
{
foreach (IAppender usedAppender in LogManager.GetRepository().GetAppenders())
{
usedAppender.DoAppend(loggingEvent);
}
}
}
и, наконец, класс установки, которая связывает два и настраивает log4net:
public class CrossDomainChildLoggingSetup : MarshalByRefObject
{
private CrossDomainParentAppender parentAppender;
public void ConfigureAppender(CrossDomainParentAppender crossDomainParentAppender)
{
parentAppender = crossDomainParentAppender;
CrossDomainOutboundAppender outboundAppender = new CrossDomainOutboundAppender(parentAppender);
log4net.Config.BasicConfigurator.Configure(outboundAppender);
}
}
Теперь - когда вы настраиваете вверх ваш AppDomain вы можете добавить следующее совместное de ...
CrossDomainParentAppender crossDomainParentAppender = new CrossDomainParentAppender();
Type crossDomainType = typeof(CrossDomainChildLoggingSetup);
CrossDomainChildLoggingSetup crossDomainChildLoggingSetup = (CrossDomainChildLoggingSetup)domain.CreateInstanceFrom(crossDomainType.Assembly.Location, crossDomainType.FullName).Unwrap();
crossDomainChildLoggingSetup.ConfigureAppender(crossDomainParentAppender);
... и все входящие в дочерний домен появляются в журнале родительских доменов. (Пожалуйста, обратите внимание: я CreateInstaceFrom(assemblyFilePath,...)
- в зависимости от настроек, может не требовать загрузки по Filepath)
Хотя я не нашел каких-либо ошибок или проблем: Если вы видите какие-либо недостатки или проблемы, которые могут возникнуть, пожалуйста, дайте мне знать, ,
Не может ли это вызвать проблемы с блокировкой, если два регистратора попытаются добавить в один файл? – Bartosz