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



我使用的是djutils的async装饰器,因为它运行在一个单独的线程上,所以在引发异常时不会发送跟踪邮件。

但是,它有以下位置放置记录器。

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/文件很容易,但我真的希望它像设置中定义的那样发送常规跟踪。我该怎么做呢?

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

首先,在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()

最新更新