2009-10-23 13 views
5

मेरा एप्लिकेशन अच्छी तरह से परिभाषित नामों के साथ कई धागे का उपयोग करता है (यानी 'अज्ञात' धागे वाले थ्रेड पूल नहीं)। अभी, ये सभी धागे अपने लॉग संदेशों को एक फ़ाइल में भेजते हैं - और हालांकि थ्रेड आईडी लॉग लाइन का हिस्सा है, इससे एप्लिकेशन व्यवहार का विश्लेषण करना बहुत मुश्किल हो जाता है। इस प्रकार, मैं चाहता हूं कि प्रत्येक थ्रेड अपनी लॉग फ़ाइल में लॉग इन करे।Log4Net के साथ प्रति थ्रेड अलग फ़ाइलों में लॉग इन कैसे करें?

ऐसा लगता है कि Log4Net थ्रेड के आधार पर एक एपेंडर चुनने के लिए कोई अंतर्निहित विकल्प प्रदान नहीं करता है। क्या किसी को इसका समाधान पता है? ध्यान दें कि मैं स्पष्ट रूप से किसी अन्य लॉगिंग लाइब्रेरी पर स्विच करना पसंद नहीं करूंगा।

+0

आपने इसके साथ क्या किया? मेरे पास धागे की संख्या को छोड़कर सटीक वही आवश्यकता है और धागे के नाम ज्ञात नहीं हैं या रनटाइम तक सेट नहीं हैं। –

+0

मैंने समस्या का समाधान नहीं किया क्योंकि मुझे एक नया काम मिला। वैसे भी, पीटर का समाधान मेरे लिए काम करता, और मैं कल्पना करता हूं कि आपके लिए एपीआई कार्यों के माध्यम से एपेंडर कॉन्फ़िगरेशन बनाना। –

+0

यदि किसी और को इसके लिए एक आसान समाधान की आवश्यकता है तो यहां जवाब देखें http://stackoverflow.com/questions/6956064/logging-to-an-individual-log-file-for-each-individual-thread –

उत्तर

3

"चयन" परिशिष्ट का लॉग 4नेट तरीका फ़िल्टरिंग के माध्यम से है। आपके परिदृश्य में आपको कई एपेंडर्स स्थापित करने का एक तरीका चाहिए, प्रत्येक एक अच्छी तरह से परिभाषित थ्रेड का प्रतिनिधित्व करता है, और प्रत्येक एपेंडर में फ़िल्टर केवल अपने संबंधित धागे से संदेशों के माध्यम से गुजरता है।

चूंकि थ्रेड आईडी निर्धारित नहीं है, इसलिए आपको अपनी फ़िल्टरिंग करने के लिए कुछ और चाहिए। मुझे लगता है कि आप इन धागे के निर्माण को स्वयं नियंत्रित कर रहे हैं और सुझाव देते हैं कि प्रत्येक थ्रेड the ThreadContext में किसी संपत्ति में पहचानकर्ता पंजीकृत करता है। इसके बाद आप पहचानकर्ताओं के आधार पर संदेशों को फ़िल्टर करने के लिए the PropertyFilter का उपयोग कर सकते हैं।

यहां एक नमूना कॉन्फ़िगरेशन सेटअप है जिसमें दो एपेंडर्स हैं, प्रत्येक संलग्न संदेश जहां संपत्ति का वर्तमान मूल्य threadId किसी दिए गए पहचानकर्ता से मेल खाता है।

<appender name="x"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadX" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<appender name="y"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadY" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<root> 
    <appender-ref name="x" /> 
    <appender-ref name="y" /> 
</root> 
+0

आप कैसे करेंगे अगर थ्रेड और उनके नाम रनटाइम तक नहीं जानते थे? –

+2

@goku_da_master आप कोड में एपेंडर कॉन्फ़िगरेशन का निर्माण कर सकते हैं, जो कम से कम यदि आप थ्रेड सृजन के नियंत्रण में हैं, तो एक दृष्टिकोण हो सकता है। यदि नहीं, तो मैं कहूंगा कि सबसे अच्छा विकल्प एक सामान्य स्रोत (उदा। डेटाबेस) पर लॉग इन करना है जिसे थ्रेड आईडी के आधार पर अधिक आसानी से पूछताछ की जा सकती है। –

संबंधित मुद्दे