是否有可能挂钩来自try
- except
代码块的Django内置错误报告电子邮件?换句话说,将默认错误报告和堆栈跟踪通过电子邮件发送到ADMINS
/ MANAGERS
,同时仍然具有特定于情境的错误处理。
具体示例:
在执行复杂计算和生成大型报告的项目中,显示报告页面的视图会执行所有计算并生成一个包含大量漂亮表格和图形的长html页面,还可以从同一HTML的各个部分生成可下载的PDF。 / p>
最近,我们在PDF生成中出现了S3存储问题。现在这显然是我们需要跟踪和参加的错误,但大多数用户都很高兴,如果他们只能在屏幕上看到报告。如果没有显示PDF下载链接,问题可能会在数小时甚至数天内完全被忽视 - 但应该通知开发团队。
理想情况下,但不一定,我会喜欢与记录器无关的解决方案,它将使用任何错误记录器并触发默认的500错误处理程序,并返回finally
块或之后except
阻止。
答案 0 :(得分:1)
您需要做的就是使用Python的日志记录框架在适当的级别引发适当的消息。在settings.py
中,有一个LOGGING
变量,用于定义记录事件的方式。默认情况下,我相信Django ERROR
中的任何django.request
都将由mail_admins
处理。
因此,在您的代码中,您需要做的就是
import logging
logger = logging.getLogger(__name__) # this will create a logger with the module being the logger name
try:
#do stuff you watch to catch
except:
# we're going to catch and just log it
logger.error('Some error title', exc_info=True) # exc_info=True will include the stacktrace
finally:
# what you want to do in your finally block.
注意,这将吞下异常并且不会冒泡它。您的回复将以200返回。如果您想要填充异常,只需在raise
块中调用except
即可。但是,如果您关心的只是记录错误,但视图仍然有效,那么只需记录并吞下它。
在LOGGING
变量中,您可以为记录器添加其他条目以获取不同的记录器名称。您可以将应用程序日志设置为不同的日志记录状态,如果要调试某个代码路径,请说INFO
。只要您使用模块名称创建记录器,就可以灵活地将日志记录分段到不同的处理程序,例如mail_admins.
最后,我建议您查看sentry,因为它是一个非常棒的错误记录工具。