0

try是否可以从-except代码块挂钩到 Django 内置的错误报告电子邮件?换句话说,将默认错误报告和堆栈跟踪通过电子邮件发送到ADMINS/MANAGERS同时仍然具有特定于情况的错误处理。

具体例子:

在执行复杂计算和生成大型报告的项目中,显示报告页面的视图会执行所有计算,并生成一个包含许多漂亮表格和图形的长 html 页面,还可以从相同 HTML 的部分生成可下载的 PDF。

最近,由于 S3 上的存储问题,我们在生成 PDF 时遇到了错误。现在这显然是一个我们需要追踪和处理的错误,但大多数用户只要能在屏幕上看到报告就会很高兴。如果 PDF 下载链接没有显示,问题可能会在几个小时甚至几天内完全被忽视 - 但应该通知开发团队。


理想情况下,但不一定,我会喜欢一个与记录器无关的解决方案,它将使用任何错误记录器并触发默认的 500 错误处理程序,并返回到finally块或except块之后。

4

1 回答 1

1

您需要做的就是使用 Python 的日志框架在适当的级别引发适当的消息。在你settings.py有一个LOGGING变量,它定义了事情的记录方式。默认情况下,我相信 Django 中的任何内容ERRORdjango.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,因为它是一个非常棒的错误记录工具。

于 2013-11-13T03:25:38.417 回答