2010-01-12 16 views
12

मैं ईमेल के माध्यम से django त्रुटि रिपोर्टिंग का उपयोग करता हूं। यह आमतौर पर एक बहुत उपयोगी सुविधा है, सिवाय इसके कि अब हमारे पास 5 मिनट का डाटाबेस डाउनटाइम है और मुझे 2000 ईमेल मिल गए हैं। क्या कोई मिडलवेयर है जो मुझे ईमेल की संख्या को थ्रॉटल करने में मदद करेगा django प्रति मिनट भेज सकता है?Django त्रुटि ईमेल को कैसे थ्रॉटल करें

उत्तर

9

एक उदाहरण के रूप Gattster के महान उत्तर का उपयोग करना, मैं Django में निर्मित कैश कार्यों के आधार पर एक सरल कार्यान्वयन लिखा था।

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'class': 'fully.qualified.path.to.handler.ThrottledAdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 

जहां परिवर्तन केवल परिवर्तन के लिए है:

# -*- coding: utf-8 -*- 

from django.utils.log import AdminEmailHandler 
from django.core.cache import cache 


class ThrottledAdminEmailHandler(AdminEmailHandler): 

    PERIOD_LENGTH_IN_SECONDS = 10 
    MAX_EMAILS_IN_PERIOD = 1 
    COUNTER_CACHE_KEY = "email_admins_counter" 

    def increment_counter(self): 
     try: 
      cache.incr(self.COUNTER_CACHE_KEY) 
     except ValueError: 
      cache.set(self.COUNTER_CACHE_KEY, 1, self.PERIOD_LENGTH_IN_SECONDS) 
     return cache.get(self.COUNTER_CACHE_KEY) 

    def emit(self, record): 
     try: 
      counter = self.increment_counter() 
     except Exception: 
      pass 
     else: 
      if counter > self.MAX_EMAILS_IN_PERIOD: 
       return 
     super(ThrottledAdminEmailHandler, self).emit(record) 

और लॉगिंग विन्यास काम करने के लिए इस हैंडलर के लिए Django 1.9 में बदल दिया गया है और साथ ही, इसलिए क्रम में, आप लॉगिंग कॉन्फ़िगर करने के लिए के रूप में की जरूरत है django.request से django से लॉगर का नाम। यदि आप लॉगिंग सिस्टम प्रलेखन में देखते हैं, तो यह शायद logging filter को कार्यान्वित करके क्लीनर (?) तरीके से हासिल किया जा सकता है।

+1

अच्छा। मुझे यह पसंद है कि यह रेडिस कनेक्शन पर निर्भर नहीं है और django के कोर कैश फ्रेमवर्क का उपयोग करता है – Gattster

+1

'get_cache' अब हटा दिया गया है (Django 1.9 के रूप में)। 'django.core.cache आयात कैश' से' का उपयोग कर - लेकिन कई धागे या प्रक्रियाओं में एक समस्या प्रतीत होती है ... अभी भी काम कर रहा है ... – sebhaase

+1

Django 1.9 डिफ़ॉल्ट लॉगिंग कॉन्फ़िगरेशन बदल गया ताकि Django संबंधित सामग्री है 'django' लॉगर और ** ** ** django.request' लॉगर के माध्यम से लॉग इन के रूप में लॉग इन के रूप में लॉग इन किया गया है। सुनिश्चित करें कि आप इसे ठीक करते हैं यदि आप प्रदान की गई config @Gattster को कॉपी/पेस्ट करने जा रहे हैं। '' ' 'वालों': लॉगिंग अनुभाग की तरह दिखना चाहिए { 'Django': { 'संचालकों': [ 'mail_admins'], 'स्तर': 'त्रुटि', 'का प्रचार': यह सच है , }, } '' – miha

1

मुझे लगता है डेटाबेस डाउनटाइम जानबूझकर नहीं किया गया था, जो मामले में आप शायद maintenance mode किसी तरह का में अपने Django प्रक्रिया रख सकते हैं या इसे ऑफ़लाइन ले लिया है चाहिए?

अन्यथा, हमेशा की तरह मेल एप्लिकेशन django-mailer है बस आप मदद की है हो सकता है, क्योंकि यह आपके डेटाबेस में जाने वाली मेल को संग्रहीत करता है और इस तरह विफल रही है | :)

तुम सच में की सीमा यह सबसे अच्छा करने के लिए किया जाएगा रेट करने के लिए की जरूरत है तो आपके एमटीए में। यह सिर्फ एमटीए प्रक्रिया के हिस्से के फड़फड़ाने पर this patch for qmail to throttle incoming connections as a means of fighting spam

0

शायद Nagios' page का उपयोग कर की तरह मेल या कुछ और विदेशी भेजने के लिए उत्तरदायी लायक है पढ़ने

2

एक विकल्प को बंद करने की क्षमता के लिए अर्थ हो सकता है ErrorStack की तरह कुछ करने के लिए स्विच करने के लिए है त्रुटि की सूचना देना। मैंने आपके प्रोजेक्ट में एकीकृत करने के लिए बेवकूफ-सरल बनाने के लिए django app लिखा था।

+0

यह एक अच्छा दृष्टिकोण की तरह लगता है। क्या आपने hoptoad.com का भी मूल्यांकन किया था? मुझे यह तय करने की ज़रूरत है कि कौन सी सेवा चुननी है। – Gattster

+0

नहीं, मैंने विस्तार से हॉपटैड को नहीं देखा है। –

7

मैंने निम्नलिखित करके 10 मिनट प्रति मिनट तक ईमेल सीमित कर दिया। यह मेरे इंस्टॉलेशन के लिए अद्वितीय एक लाल कनेक्शन कनेक्शन का उपयोग करता है। मैं आपकी आवश्यकताओं के अनुरूप incr_counter फ़ंक्शन को संशोधित करने का सुझाव देता हूं। सुरक्षित होने के लिए, इसके लिए सीधे लाल या मेमकैच कनेक्शन का उपयोग करें और किसी भी django.cache wrappers नहीं।

settings.py

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'class': 'error_email_limiter.handler.MyAdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
      }, 
     } 
} 

error_email_limiter/handlers.py

class MyAdminEmailHandler(AdminEmailHandler): 
    def incr_counter(self): 
     c = get_redis_connection() 
     key = self._redis_key() 
     res = c.incr(key) 
     c.expire(key, 300) 
     return res 

    def _redis_key(self): 
     return time.strftime('error_email_limiter:%Y-%m-%d_%H:%M', 
          datetime.datetime.now().timetuple()) 

    def emit(self, record): 
     try: 
      ctr = self.incr_counter() 
     except Exception: 
      pass 
     else: 
      if ctr >= 10: 
       return 
     super(MyAdminEmailHandler, self).emit(record) 
संबंधित मुद्दे