2009-07-07 11 views
15

मेरे पास एक ऐसा एप्लिकेशन है जो एक एपडोमेन से log4net प्रारंभ करता है और इसे किसी अन्य एपडोमेन में उपयोग करने की आवश्यकता होती है। क्या यह समर्थित है?एपडोमेन में log4net

यदि नहीं, तो क्या मुझे प्रत्येक एपडोमेन से log4net प्रारंभ करना चाहिए? क्या एक ही आवेदन में कई प्रारंभिकताओं में कोई जोखिम है? क्या मुझे एक ही log4net.config का उपयोग करना चाहिए?

उत्तर

10

log4net-user मेलिंग सूची में एक उत्तर है जो RollingFileAppender के साथ काम करता है। log4net.config में appender में निम्नलिखित पंक्ति जोड़ें:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
5

लॉगर को प्रति ऐप-डोमेन में एक बार प्रारंभ किया जाना चाहिए।

+0

क्या दो लॉगर एक ही फ़ाइल में संलग्न करने का प्रयास करते समय लॉक समस्याओं का कारण नहीं बनेंगे? – Bartosz

3

एक ऐप डोमेन के बाद, डारिन के साथ सहमत हैं। यदि आप इन अनुप्रयोगों को समेकित लॉगिंग का उपयोग करना चाहते हैं, तो आप एक लॉगिंग लक्ष्य चुनना चाहेंगे जो विवाद के अधीन नहीं होगा (यानी FileAppender या RollingFileAppender नहीं)।

7

हालांकि सवाल कई साल पुराना है - हो सकता है यह किसी को मदद मिलती है:

यह वालों माता पिता 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 से लोड हो रहा है की आवश्यकता नहीं कर सकते हैं)

हालांकि मैं किसी भी कीड़े या समस्याओं नहीं मिला है: आप किसी भी खराबी या समस्या पैदा कर सकता है देखते हैं, तो कृपया मुझे बताएं ।

+0

वास्तव में जिस तरह का दृष्टिकोण मैं ढूंढ रहा था। धन्यवाद। –

+2

यदि मैं मूलभूत कॉन्फ़िगरेशन लेने के लिए निम्नलिखित में बदल रहा हूं, तो मूलभूत कॉन्फ़िगरेशन (कॉन्फ़िगरेशन (outputAppender) के बजाय, मैं सुधार का सुझाव दे सकता हूं: var hierarchy = (पदानुक्रम) LogManager.GetRepository(); पदानुक्रम। रूट। AddAppender (आउटबाउंड ऐपेंडर); पदानुक्रम। कॉन्फ़िगर = सत्य; –

+0

क्या आप इसका उपयोग करते समय एक RemotingException प्राप्त कर लिया है? मुझे एक ऑब्जेक्ट मिलेगा "ऑब्जेक्ट '/a0720457_c9e6_4edf_bde5_86d96058cb4e/+mauuadzzsfpiaad3bjv4uss_264.rem' डिस्कनेक्ट हो गया है या सर्वर पर मौजूद नहीं है।" जो मुझे विश्वास है कचरा संग्रह के कारण है। कोई राय कि इसे कैसे ठीक किया जाए? – Charlie

0

मेरा उत्तर लिंकी के उत्तर में जोड़ता है।

जैक एलन के प्रश्न का उत्तर देने के लिए। आप को बदलने CrossDomainOutboundAppender वर्ग को हल करके इस का समाधान कर सकते हैं:

/// <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(FixFlags.All)); 
     crossDomainParentAppender.Append(copied); 
    } 
} 

सूचना FixFlags.All

के वर्तमान संस्करण .... है एक दोष संदेश लॉग इन करने, thats की तरह सभी appenders के कारण log4net के उद्देश्य को हराकर, क्योंकि विभिन्न लॉगर्स उदाहरण के लिए एक अलग स्तर पर लॉग कर सकते हैं। वर्ग की मेरी सुधार संस्करण:

/// <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) 
    { 
     LogManager.GetRepository().Log(loggingEvent); 
    } 
} 

यह logmanager करने के लिए लॉग वितरित करता है, इस का पता लगाना होगा जहां लॉग, जो लकड़हारा जिम्मेदार है आदि जगह