手动触发Django 1.3的回溯/异常日志

时间:2011-09-29 17:08:13

标签: django

我正在使用djutils的异步装饰器,它有一个令人讨厌的副作用,即在引发异常时不发送回溯电子邮件,因为它在一个单独的线程上运行。

但是,它确实有以下地方放置记录器。

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

我已经确认这会有效,但即使删除了try / except,它也不会使Django的追踪记录器绊倒。

虽然告诉它在异常时写入db / file非常容易,但我真的很喜欢它按照设置中的定义发送常规回溯。我怎么能这样做?

编辑:答案似乎涉及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()

1 个答案:

答案 0 :(得分:3)

首先,配置您的日志设置i 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()