2011-09-29 22 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()