Bien que la question est de plusieurs années - peut-être il aide quelqu'un:
Il est possible d'utiliser les enregistreurs configurés dans le AppDomain parent. Ce qui doit être fait est route le LoggingEvent
de l'enfant AppDomain au parent AppDomain. Pour cela, vous devez créer un Appender personnalisé qui transmet les dossiers sur le domaine des enfants ...
/// <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);
}
}
, une classe personnalisée qui reçoit le LoggingEvent et les a transmis à votre disposition ajoute IAppender
s ...
/// <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);
}
}
}
et enfin une classe d'installation qui lie les deux et configure 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);
}
}
maintenant - lorsque vous configurez votre AppDomain vous pouvez ajouter la co suivante de ...
CrossDomainParentAppender crossDomainParentAppender = new CrossDomainParentAppender();
Type crossDomainType = typeof(CrossDomainChildLoggingSetup);
CrossDomainChildLoggingSetup crossDomainChildLoggingSetup = (CrossDomainChildLoggingSetup)domain.CreateInstanceFrom(crossDomainType.Assembly.Location, crossDomainType.FullName).Unwrap();
crossDomainChildLoggingSetup.ConfigureAppender(crossDomainParentAppender);
... et tout ce qui est enregistré dans le domaine enfant apparaît dans le journal des domaines parents. (S'il vous plaît noter: je CreateInstaceFrom(assemblyFilePath,...)
- en fonction de votre configuration, vous ne pouvez pas exiger le chargement par filePath)
Bien que je ne l'ai pas trouvé de bugs ou problèmes: Si vous constatez des défauts ou des problèmes qui pourraient se poser s'il vous plaît laissez-moi savoir .
Ne causerait-il pas des problèmes de verrouillage lorsque deux enregistreurs essaient d'ajouter au même fichier? – Bartosz