2011-09-29 51 views
3

我正在使用djutils的異步裝飾器,它具有在發生異常時不發送追溯電子郵件的惡劣副作用,因爲它在單獨的線程上運行。手動激發Django 1.3的追蹤/異常日誌

但是,它確實有以下放置記錄器的地方。

def worker_thread(): 
    while 1: 
     func, args, kwargs = queue.get() 
     try: 
      func(*args, **kwargs) 
     except: 
      pass # <-- log error here 
     finally: 
      queue.task_done() 

我已經證實了這一點的工作,但即使在try /未移除的,也不會跳閘Django的追蹤記錄。

雖然它很容易告訴它寫入異常的數據庫/文件,但我真的希望它發送一個定期的回溯定義在設置中。我怎樣才能做到這一點?

編輯:答案似乎涉及django.utils.log.AdminEmailHandler - 但我很難找到一個例子。

編輯2:這是我目前的(99%可能是錯誤的)嘗試。

from django.utils.log import AdminEmailHandler 
def worker_thread(): 
    while 1: 
     func, args, kwargs = queue.get() 
     try: 
      func(*args, **kwargs) 
     except: 
      import logging 
      from django.conf import settings 
      print settings.EMAIL_HOST 
      logger = logging.getLogger("async.logger") 
      logger.exception("Async exploded") 
      AdminEmailHandler 
      pass # <-- log error here 
     finally: 
      queue.task_done() 
+0

您是否嘗試記錄錯誤,如下所示:https://docs.djangoproject.com/zh/dev/topics/logging/(電子郵件由日誌框架發送) – akonsu

+0

我已經建立了d這個: 導入日誌; logger = logging.getLogger(「async.logger」); logger.exception(「Async exploded」); 哪有火,但似乎沒有做任何事情。我會首先承認我可能實施錯誤。 –

+0

您的settings.py中是否有正確的電子郵件設置(例如EMAIL_HOST,EMAIL_HOST_PASSWORD等)? – akonsu

回答

3

首先,配置您的日誌記錄設置我的settings.py:


    LOGGING = { 
     'version': 1, 
     'disable_existing_loggers': False, 
     'handlers': { 
      'mail_admins': { 
       'level': 'ERROR', 
       'class': 'django.utils.log.AdminEmailHandler' 
      } 
     }, 
     'loggers': { 
      'myproject': { 
       'handlers': ['mail_admins'], 
       'level': 'INFO', 
       'propagate': True, 
      }, 
      'django.request': { 
       'handlers': ['mail_admins'], 
       'level': 'ERROR', 
       'propagate': True, 
      }, 
     } 
    } 

從現在開始,這與 'MyProject的' 開頭的所有記錄儀應使用AdminEmailHandler 你的代碼應該是這樣的:


    import logging 
    logger = logging.getLogger('myproject.optional.path') 
    # example 
    # logger = logging.getLogger('myprojects.myapp.views') 
    def worker_thread(): 
     while 1: 
      func, args, kwargs = queue.get() 
      try: 
       func(*args, **kwargs) 
      except: 
       logger.exception("Async exploded") 
      finally: 
       queue.task_done()