Aunque la cuestión es de varios años - tal vez ayude a alguien:
Es posible utilizar los registradores configurados en el dominio de aplicación de los padres. Lo que se debe hacer es encaminar el LoggingEvent
s desde el AppDomain hijo al Dominio de aplicación padre. Para ello, tiene que crear un Appender de encargo que envía los registros de dominio secundario ...
/// <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);
}
}
, una clase personalizada que recibe el LoggingEvent remitido y los añade a IAppender
disponibles 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);
}
}
}
y finalmente una clase de instalación que une a los dos y configura 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);
}
}
ahora - al configurar su dominio de aplicación puede agregar el siguiente co de ...
CrossDomainParentAppender crossDomainParentAppender = new CrossDomainParentAppender();
Type crossDomainType = typeof(CrossDomainChildLoggingSetup);
CrossDomainChildLoggingSetup crossDomainChildLoggingSetup = (CrossDomainChildLoggingSetup)domain.CreateInstanceFrom(crossDomainType.Assembly.Location, crossDomainType.FullName).Unwrap();
crossDomainChildLoggingSetup.ConfigureAppender(crossDomainParentAppender);
... y todo lo que haya iniciado sesión en el dominio secundario aparece en el registro de dominios principal. (Nota: He utilizado CreateInstaceFrom(assemblyFilePath,...)
- dependiendo de su configuración es posible que no requiere de carga por rutaArchivo)
Aunque no he encontrado ninguna errores o problemas: Si hay defectos o problemas que pudieran surgir por favor hágamelo saber .
¿No causaría problemas de bloqueo cuando dos registradores intentan agregar al mismo archivo? – Bartosz