我正在使用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()
答案 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()