【问题标题】:Logging 500 Error Traceback through Middleware通过中间件记录 500 错误回溯
【发布时间】:2014-03-28 04:35:00
【问题描述】:

我想记录在 500 内部服务器错误期间发生的回溯。我已经设置了我希望这样做的中间件:

import traceback
import sys

import logging
logger = logging.getLogger(__name__)

class ProcessExceptionMiddleware(object):
    '''
    Log exceptions and tracebacks any time an exception is encountered
    '''

    def process_response(self, request, response):·
        if response.status_code == 500:
            logger.info('\n'.join(traceback.format_exception(*sys.exc_info())))
        return response

唉,当发生 500 错误并触发此中间件时,sys.exc_info() 返回 (None, None, None)。 response 本身是一个包含回溯的字符串,但它是一个格式怪异且不易解析的字符串。我希望将回溯格式化为像 sys.exc_info() 这样的漂亮列表格式。我怎样才能得到这个工作?

请注意 process_exception 是不可能的,因为这是针对不使用 Django 视图的 API,并且 process_exception 仅捕获视图中引发的异常。

【问题讨论】:

    标签: python django


    【解决方案1】:

    Django 已经知道如何使用完整的回溯记录未处理的错误。默认配置是通过邮件将报告发送到settings.ADMINS,但您可以重新配置记录器以写入日志文件、syslog、stderr 或其他任何内容。完整的文档在这里https://docs.djangoproject.com/en/1.6/topics/logging/

    【讨论】:

    • 理论上看起来不错,但我还没有看到一个不需要以某种方式利用中间件的工作示例。我不确定为什么。如果你有一个在野外见过的工作,我会全力以赴。
    • 这不是理论上的,您不必滚动自己的中间件来记录未处理的异常。只需配置您想要的处理程序并将其添加到您的设置中的django.requests 记录器。
    【解决方案2】:

    实现process_exception 挂钩。如果你从process_exception内部调用sys.exc_info(),它会返回异常数据。

    https://docs.djangoproject.com/en/3.1/topics/http/middleware/#process-exception

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2018-12-21
      • 2018-04-29
      • 2012-11-07
      • 1970-01-01
      相关资源
      最近更新 更多