2012-02-10 8 views
6

मैं अपने पायथन अपवादों को पकड़ने के लिए मानक SMTPHandler लॉगर का उपयोग कर रहा हूं। क्या कोई तरीका है कि मेल के विषय में अपवाद नाम कैसे रखा जाए? यह स्थिर विषय के मुकाबले बहुत बेहतर होगा, क्योंकि जीमेल (और न केवल जीमेल) विषय के अनुसार वार्तालापों को समूहबद्ध कर सकता है और इसलिए यह त्रुटि के प्रकार के अनुसार इसे समूहित कर सकता है।क्या कोई तरीका है कि अधिक उन्नत सामग्री करने के लिए पायथन में SMTPHandler को कॉन्फ़िगर कैसे करें?

उदा।, अगर 50 पूरी तरह से एक ही त्रुटि + 1 अलग होती है, तो मुझे 51 ईमेल वाले 1 समूह के बजाय अपने इनबॉक्स में दो बातचीत दिखाई देगी, जहां मैं एक अलग से आसानी से अनदेखा कर सकता हूं।

इसके अलावा, एक ही तरह से त्रुटियों को भेजने से रोकने का तरीका है? ई जी। किसी भी तरह से यह तय करने के लिए कि क्या ईमेल भेजा जाना है या नहीं, अपने स्वयं के कार्य को परिभाषित करें। फ़ंक्शन पैराम में कुछ मूलभूत जानकारी लेगा, इसलिए यह निर्णय ले सकता है (उदा। कैश & देखें कि क्या कोई समस्या पहले ही भेजी गई थी)।

मैंने दस्तावेज़ों को ब्राउज़ किया, लेकिन मुझे ऐसा कुछ नहीं मिला। ऐसा लगता है कि यह बहुत आसान है। यदि SMTPHandler ऐसा नहीं कर सकता है, तो सबसे अच्छा और अभी भी सरल विकल्प क्या होगा? कोई साफ पुस्तकालय?

धन्यवाद!

उत्तर

7

आप बस SMTPHandler की अपनी खुद की उपवर्ग बनाने की जरूरत के लिए अपनी कार्यक्षमता बदल सकते थे।

आपके पहले अनुरोध के लिए: आपको केवल getSubject(record) विधि को ओवरराइड करने की आवश्यकता है। इस विषय में आप क्या डाल सकते हैं, लॉगिंग से फ़ॉर्मेटर आयात करने के बाद help(Formatter) देखें।

आपके दूसरे अनुरोध के लिए: आपको emit(record) विधि को ओवरराइड करना होगा। रिकॉर्ड का निरीक्षण करें और इसके बारे में अपना निर्णय लें कि इसे भेजना चाहिए या नहीं। यदि ऐसा है तो बस super(SMTPHandler,self).emit(record) विधि पर कॉल करें।

class MySMTPHandler(SMTPHandler): 

    def getSubject(self, record): 
     return "My Error Format from the record dict" 

    def emit(self, record): 
     #check for record in self.already_send or something 
     if sendit: 
      super(MySMTPHandler,self).emit(record) 
0

आप SMTPHandler वर्ग के वारिस और बढ़ाने या उदाहरण

class A(object): 
    def __init__(self): 
     self.email = "[email protected]" 

    def send_error(self, error): 
     send_mail(self.email, error) 

class B(A): 
    def __init__(self): 
     A.__init__(self) 

    def send_error(self, error): 
     if not error.sent: 
      A.send_mail(self, error) 
     else: 
      #do nothing 
      pass 
1

आसान और लचीला तरीका न केवल ईमेल सामग्री को प्रारूपित करना है, बल्कि ईमेल विषय भी प्रारूपित करना है। इसके लिए logging.handlers.SMTPHandler उपclassing की आवश्यकता है।

इस तरह यदि आपके द्वारा कॉन्फ़िगर किए गए विषय में कोई परिवर्तनीय संदर्भ हैं, तो इसे मांग पर विस्तारित किया जाएगा। यहाँ परीक्षण कोड सहित दिया गया है:

import logging, logging.handlers 
    class TitledSMTPHandler(logging.handlers.SMTPHandler): 
     def getSubject(self, record): 
      formatter = logging.Formatter(fmt=self.subject) 
      return formatter.format(record) 

    # below is to test 
    logging.getLogger().addHandler(TitledSMTPHandler(
     ('your.smtp.server',587), 
     '[email protected]', '[email protected]', 
     '%(asctime)s Error: %(message)s', 
     ('SMTP login', 'SMTP password'),() 
    )) 

    logging.error("TestError") 

, तुम्हारा साथ एसएमटीपी विन्यास बदलें कोड चलाने के लिए और जहां त्रुटि संदेश के विषय में है (ईमेल के मुख्य भाग में) आप एक ईमेल प्राप्त करना चाहिए।

यदि आप लॉगिंग कॉन्फ़िगरेशन फ़ाइल में हैंडलर को परिभाषित करते हैं, तो पैरामीटर संदर्भों से बचने के लिए याद रखें। जैसे %(asctime)s कॉन्फ़िगरर्स के समयपूर्व इंटरपोलेशन को रोकने के लिए %%(asctime)s बनना चाहिए - हालांकि %% भागने पाइथन 3.1 में और पहले से सींग नहीं किया जाता है।


कृपया, यदि आप एक समय में एक प्रश्न पूछते हैं, तो आप अन्य Googlers को बहुत मदद करेंगे। आपको दो विषयों को शुरू करना चाहिए, एक को "क्या कोई तरीका है कि मेल के विषय में अपवाद नाम कैसे रखा जाए?" और दूसरा "क्या एक तरीका है कि अभी भी वही त्रुटियां भेजने से कैसे रोकें?"

मैं केवल एक विषय पर ध्यान केंद्रित करने के लिए आपके पहले प्रश्न का उत्तर दूंगा। शायद आपने सोचा था कि दो प्रश्न एक-दूसरे के आधार पर हो सकते हैं इसलिए उन्हें एक साथ पूछा जाना चाहिए, जबकि वे केवल आपके दिमाग में आए। मुझे लगता है कि

मैं भी comp.lang.python पर जाने का सुझाव देना चाहूंगा यदि प्रश्न एक खुला विषय है और/या अच्छी तरह से परिभाषित नहीं किया जा सकता है (उदाहरण के लिए "मैं उन्नत सामान चाहते हैं, हर कोई क्या उपयोग करता है?")

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

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