是否可以连接到 Django 的内置错误报告来自try
- except
代码块的电子邮件?换句话说,通过电子邮件将默认错误报告和堆栈跟踪发送到ADMINS
/MANAGERS
,同时仍然具有特定于情况的错误处理。
具体示例:
在执行复杂计算和生成大型报告的项目中,显示报告页面的视图会执行所有计算,并生成一个包含大量漂亮表格和图形的长 html 页面,还可以从同一 HTML 的各个部分生成可下载的 PDF。
最近,由于 S3 上的存储问题,我们在 PDF 生成中遇到了错误。现在这显然是我们需要跟踪和参与的错误,但如果大多数用户可以在屏幕上看到报告,他们会很高兴。如果 PDF 下载链接没有显示,问题可能会在数小时甚至数天内完全不被注意到 - 但应该通知开发团队。
理想情况下,但不一定,我想要一个与记录器无关的解决方案,它将使用使用的任何错误记录器并触发默认的 500 错误处理程序,并返回到finally
块或except
块之后。
您需要做的就是使用 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。 如果您想冒泡异常,只需在except
块中调用raise
即可。 但是,如果您只关心记录错误,但视图仍然有效,那么只需记录并吞下它。
在 LOGGING
变量中,您可以为不同的记录器名称向记录器添加其他条目。 你可以让应用日志处于不同的日志记录状态,例如INFO
如果要调试某个代码路径。 只要使用模块名称创建记录器,就可以非常灵活地将日志记录分段为不同的处理程序,例如mail_admins.
最后,我建议研究哨兵,因为它是一个非常出色的错误记录工具。