हालांकि सवाल कई साल पुराना है - हो सकता है यह किसी को मदद मिलती है:
यह वालों माता पिता AppDomain में विन्यस्त उपयोग करना संभव है। क्या करने की आवश्यकता है बच्चे एपडोमेन से माता-पिता AppDomain तक LoggingEvent
एस रूट करें। इसके लिए आपको एक कस्टम 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 आप निम्नलिखित सह जोड़ सकते हैं डी ...
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