2009-10-23 18 views
12

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

ऐसा लगता है कि यह छोटा होना चाहिए, और लॉगिंग पैकेज का हिस्सा होना चाहिए, लेकिन मुझे इसके बारे में कुछ भी नहीं मिला, कोई उदाहरण नहीं, Google पर कुछ भी नहीं।

log = logging.getLogger() 
log.setLevel(logging.DEBUG) 
debug_format = logging.Formatter("%(levelname)s at %(asctime)s in %(filename)s (line %(lineno)d):: %(message)s") 

# write errors to email 
error_mail_subject = "ERROR: Script error in %s on %s" % (sys.argv[0], os.uname()[1]) 
error_mail_handler = logging.handlers.SMTPHandler(SMTP_HOST, '[email protected]'+os.uname()[1], [LOG_EMAIL], error_mail_subject) 
error_mail_handler.setLevel(logging.ERROR) 
#error_mail_handler.setLevel(logging.DEBUG) 
error_mail_handler.setFormatter(debug_format) 

# buffer debug messages so they can be sent with error emails 
memory_handler = logging.handlers.MemoryHandler(1024*10, logging.ERROR, error_mail_handler) 
memory_handler.setLevel(logging.DEBUG) 

# attach handlers 
log.addHandler(memory_handler) 
log.addHandler(error_mail_handler) 

संबंधित इस के लिए:

मैं लकड़हारा स्पष्ट रूप से अगर यह memory_handler का लक्ष्य वैसे भी है error_mail_handler जोड़ने की जरूरत है? error_mail_handler को DEBUG या ERROR लक्ष्य पर सेट किया जाना चाहिए? क्या इसे memory_handler से खिलाया जा रहा है जब भी इसे एक लक्ष्य की आवश्यकता है?

इस समस्या को हल करने वाले किसी भी व्यक्ति से कुछ कामकाजी कोड देखना अच्छा लगेगा।

उत्तर

17

आप का उपयोग या अनुकूलित करना चाहते हैं जो this test script में है।

सामान्य रूप से, यदि आप मेमोरी हैंडलर हैंडलर का लक्ष्य है जो लॉगर में जोड़ा गया है तो आपको लॉगर में हैंडलर जोड़ने की आवश्यकता नहीं है। यदि आप हैंडलर का स्तर निर्धारित करते हैं, तो इससे प्रभावित होगा कि हैंडलर वास्तव में क्या प्रक्रिया करता है - यह किसी भी प्रक्रिया को संसाधित नहीं करेगा जो इसकी स्तर सेटिंग से कम गंभीर है।

+0

ग्रेट सामान। यह मॉड्यूल के लेखक द्वारा आपके प्रश्न का उत्तर हर दिन नहीं मिलता है! – SpliFF

+0

@ विनीजजिप - इसके बजाय ईमेल भेजने के लिए smtplib मॉड्यूल का उपयोग करने के बारे में आपके विचार क्या हैं? – codingknob

+0

@ algotr8der - आप लिंक (अब अपडेट किए गए) से देख सकते हैं कि स्क्रिप्ट वास्तव में ईमेल भेजने के लिए 'smtplib' का उपयोग करती है। –

0

इस प्रयोजन के लिए मैं BufferingSMTPHandler एक नाबालिग ट्वीक साथ विनय Sajip ने सुझाव दिया उपयोग करें: मैं वास्तव में कुछ बड़ा करने के लिए बफर लंबाई सेट (जैसे कि 5000 लॉग रिकॉर्ड) और manualy हैंडलर के फ्लश विधि कॉल हर कुछ सेकंड और इंटरनेट conectivity की जांच के बाद।

# init 
log_handler1 = BufferingSMTPHandler(
    'smtp.host.lala', "[email protected]", ['[email protected]'], 'Log event(s)',5000) 
... 
logger.addHandler(log_handler1) 
... 

# main code 
... 
if internet_connection_ok and seconds_since_last_flush>60: 
    log_handler1.flush() # send buffered log records (if any) 
+2

यह केवल तभी काम करेगा जब हैंडलर अभी भी गुजरने पर गुंजाइश में है। अन्यथा, आपको फ्लश कॉल करने के लिए लॉगर ऑब्जेक्ट से हैंडलर पुनर्प्राप्त करना होगा। – DeaconDesperado

5

मैं BufferingSMTPHandler के मेरे अपने क्रूरतापूर्ण धागा सुरक्षित कार्यान्वयन जो एक अलग धागे से ईमेल भेजता है लिखा था। प्राथमिक लक्ष्य मुख्य धागे को अवरुद्ध नहीं करना है।

लिखित रूप में, यह दो कतारों का उपयोग करता है - कोड के "कॉन्फ़िगर करने योग्य पैरामीटर" खंड में परिभाषित कुछ उपयोगी वर्ग-स्तर पैरामीटर को लागू करने के लिए यह आवश्यक लग रहा था। यद्यपि आप कोड का उपयोग कर सकते हैं, लेकिन यदि आप अध्ययन करते हैं और अपनी कक्षा लिखने के लिए इसका उपयोग करते हैं तो यह संभवतः बेहतर होता है।

मुद्दे:

  • कुछ वर्ग स्तर के मानकों को शायद उदाहरण स्तरीय बजाय हो सकता है।
  • या तो threading.Timer या signal मॉड्यूल का उपयोग शायद उन लूपों से बचने के लिए किया जा सकता है जो हमेशा के लिए चलते हैं।

    import logging 
    
    from django.conf import settings 
    from django.core.mail import EmailMessage 
    
    
    class DjangoBufferingSMTPHandler(logging.handlers.BufferingHandler): 
        def __init__(self, capacity, toaddrs=None, subject=None): 
         logging.handlers.BufferingHandler.__init__(self, capacity) 
    
         if toaddrs: 
          self.toaddrs = toaddrs 
         else: 
          # Send messages to site administrators by default 
          self.toaddrs = zip(*settings.ADMINS)[-1] 
    
         if subject: 
          self.subject = subject 
         else: 
          self.subject = 'logging' 
    
        def flush(self): 
         if len(self.buffer) == 0: 
          return 
    
         try: 
          msg = "\r\n".join(map(self.format, self.buffer)) 
          emsg = EmailMessage(self.subject, msg, to=self.toaddrs) 
          emsg.send() 
         except Exception: 
          # handleError() will print exception info to stderr if logging.raiseExceptions is True 
          self.handleError(record=None) 
         self.buffer = [] 
    

    Django में settings.py आप इस तरह ईमेल और प्रवेश करने के लिए कॉन्फ़िगर करने की आवश्यकता होगी:: -

2

आप Django का उपयोग कर रहे हैं, तो यहाँ सरल बफरिंग हैंडलर, जो मानक Django ईमेल विधियों का उपयोग होगा

EMAIL_USE_TLS = True 
EMAIL_PORT = 25 
EMAIL_HOST = '' # example: 'smtp.yandex.ru' 
EMAIL_HOST_USER = '' # example: '[email protected]' 
EMAIL_HOST_PASSWORD = '' 
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER 
SERVER_EMAIL = EMAIL_HOST_USER 

LOGGING = { 
    'handlers': { 
     ... 
     'mail_buffer': { 
      'level': 'WARN', 
      'capacity': 9999, 
      'class': 'utils.logging.DjangoBufferingSMTPHandler', 
      # optional: 
      # 'toaddrs': '[email protected]' 
      # 'subject': 'log messages' 
     } 
    }, 
    ... 
} 
संबंधित मुद्दे