2010-10-30 16 views
9

मैंने अभी लॉग 4नेट के साथ खेलना शुरू कर दिया है ... अब मैं पूरी तरह से मेल में संलग्न या सीधे पूर्ण लॉग के साथ एक ईमेल भेजना चाहता हूं। SmtpAppender का उपयोग करने में समस्या यह है कि इसे एक बफर आकार की आवश्यकता होती है जो अज्ञात होगी क्योंकि इसे मेल भेजना चाहिए चाहे वह त्रुटियों से भरा हो या सिर्फ जानकारी हो।Log4Net + पूरा होने पर ईमेल भेजें?

अपडेट: मेरे कॉन्फ़िग फ़ाइल

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> 

    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="Backup Application - Log" /> 
    <smtpHost value="mailserver" /> 
    <authentication value="1" /> 
    <username value="userName" /> 
    <password value="mypw" /> 

    <port value ="25"/> 
    <lossy value="true" /> 
    <bufferSize value="500" /> 

    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="ALL"/> 
    </evaluator> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%timestamp [%thread] %-5level %logger – %message%newline" /> 
    </layout> 

</appender> 

उत्तर

16

BufferSize है कि बफ़र जा करने के लिए लॉग संदेशों की संख्या के बराबर है (यानी अगर आप 512 करने के लिए सेट मेल एक बार 512 संदेशों एकत्र किया गया है भेजा जाएगा) ।

मुझे विश्वास है कि इसे int.MaxValue (जो 2.147.483.647 है) पर सेट करना एक उचित विकल्प है। सिस्टम के लिए 2 अरब संदेश बहुत अधिक हैं, यहां तक ​​कि लंबे समय तक चलने वाले भी।

तुम मुझे 10 मिनट दे अगर मैं (स्रोत कोड से) आप पुष्टि करेंगे कि अगर आप स्वच्छ आपके आवेदन को रोकने, सभी लॉग अब तक एकत्र

भेजा जाएगा

[अपडेट]: पुष्टि की! ! विनाशक कतार को

[जोड़ें] मैं हानिकारक और मूल्यांकनकर्ता दोनों को हटा दूंगा। आपकी समस्या स्पष्ट है: बकाया पर मूल्यांकनकर्ता की प्राथमिकता है :) :)

मूल्यांकनकर्ता का उपयोग कतार को फ्लश करने के लिए किया जाता है जब एक निश्चित स्थिति पूरी हो जाती है। आपकी स्थिति true के बराबर है। जब यह स्थिति ट्रिगर होती है, तो ईमेल भेजा जाता है, इसलिए इस मेल को प्रत्येक एकल लॉग कॉल पर भेजा जाता है।

यह थोड़ा अलग लॉग फ़िल्टरिंग द्वारा प्राप्त की गई केवल जानकारी और त्रुटि संदेशों को भेजने से थोड़ा अलग है।

दो विशेषताओं को हटाएं और आपका कोड काम करेगा। Int.MaxValue को सेट करने से आप अधिकतम संभव संख्या में संदेशों को संग्रहीत कर सकते हैं। यह असंभव है (आप सुपरएरेनलोटो के 178 मिलीयन € जैकपॉट को बेहतर तरीके से जीतेंगे जैसे कुछ लोगों ने आज रात किया था, या आपके सिर में एक धूमकेतु से मारा जा रहा था) कि एक आवेदन एक रन में 2 अरब से अधिक त्रुटियों/जानकारी एकत्र करता है।

+0

मुझे लगता है कि समस्या है .. मैं अपने आवेदन को रोकने "साफ" नहीं करता (पता नहीं कैसे?) – ebb

+0

यदि आपका एप्लिकेशन क्रैश हो जाता है, तो आप संदेश हानि के अधीन हैं। सामान्य लॉगिंग में यह एक बहुत ही आम समस्या है, और इसके कारण आपको ** एक दोषपूर्ण एप्लिकेशन में संदेशों को बफर करने के लिए ** हमेशा ** से बचना चाहिए। वैसे, एक "साफ" स्टॉप अनचाहे अपवाद के बिना एक स्टॉप है। यदि आप अपनी मुख्य विधि को आजमाते हैं, तो जब आप एक त्रुटि –

+0

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

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