【问题标题】:Mail request body as well to Django Admin while server error在服务器错误时向 Django Admin 发送请求正文
【发布时间】:2016-06-22 10:51:42
【问题描述】:

我在 Django 中使用默认记录器,配置如下:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
    '()': 'django.utils.log.RequireDebugFalse'
    }
},
'handlers': {
    'mail_admins': {
        'level': 'ERROR',
        'filters': ['require_debug_false'],
        'class': 'django.utils.log.AdminEmailHandler'
    },
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler'
    }
},
'loggers': {
    'django.request': {
        'handlers': ['mail_admins', 'console'],
        'level': 'ERROR',
        'propagate': True,
    },
}

}

因此,每当我收到 500 错误时,我都会正确获取管理员电子邮件 ID 中的邮件,但它没有发送 POST 请求 JSON 数据。我发送请求如下:

curl -X POST -H 'Content-Type: application/json'  http://127.0.0.1/api/customer/ -d "{'username':'rajeevnith', 'frist_name': 'Rajeev', 'last_name':'Bahrdwaj'}"

我们如何配置 django logger 来发送这个请求正文?

【问题讨论】:

  • 你可能想看看这个stackoverflow.com/a/13940055/2028375
  • 真的不记录请求吗?我有一个非常非常相似的默认日志记录设置,并且在我的日志中看到了整个请求对象。 Django 文档甚至表明请求对象是使用额外参数记录的:docs.djangoproject.com/ja/1.9/topics/logging/#django-request 这向我表明,要么您只是没有看到它并且它在那里,要么您在代码中的某处覆盖了某些内容以使其无法运行它的建造方式。
  • @TitusP 不,它没有发送整个请求对象。它只是发送request.GET、request.POST、request。 FILES、request.COOKIES 和 request.META 而在 Content-Type: application/json 中发布数据时,数据来自 request.body
  • Django 版本?
  • @EllaShar 1.9.7

标签: python django python-2.7 django-admin tastypie


【解决方案1】:

从 Django v3.1 开始,一种方法(可能是最快的)是简单地将您的课程添加到您的 settings.py

DEFAULT_EXCEPTION_REPORTER = 'package.log.CustomExceptionReporter'

然后在log.py:

class CustomExceptionReporter(ExceptionReporter):
    def get_traceback_data(self):
        data = super().get_traceback_data()
        
        #remove settings
        del data['settings']
        
        #add body if it exists
        if self.request is not None:
            if self.request.method == "POST":
                try:
                    data['request_body'] = request.body
                except:
                    data['request_body'] = None
                
            
        return data

【讨论】:

    【解决方案2】:

    我们使用这样的管理员电子邮件处理程序,它适用于任何类型的错误。希望对你有效。

    class MyAdminEmailHandler(AdminEmailHandler):
    
        def __init__(MyAdminEmailHandler, include_html=False, email_backend=None):
            super(MyAdminEmailHandler, self).__init__(self, include_html, email_backend)
    
        def emit(self, record):
            try:
                request = record.request
                subject = '%s (%s IP): %s' % (
                    record.levelname,
                    ('internal' if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS
                     else 'EXTERNAL'),
                    record.getMessage()
                )
                filter = get_exception_reporter_filter(request)
                request_repr = '\n{0}'.format(force_text(filter.get_request_repr(request)))
            except Exception:
                subject = '%s: %s' % (
                    record.levelname,
                    record.getMessage()
                )
                request = None
                request_repr = "unavailable"
            subject = self.format_subject(subject)
    
            if record.exc_info:
                exc_info = record.exc_info
            else:
                exc_info = (None, record.getMessage(), None)
    
            message = "%s\n\nRequest repr(): %s" % (self.format(record), request_repr)
    
            reporter = ExceptionReporter(request, is_email=True, *exc_info)
            html_message = reporter.get_traceback_html() if self.include_html else None
    
            try:
                mail.mail_admins(subject, message, fail_silently=True,
                                 html_message=html_message,
                                 connection=self.connection())
            except Exception as e:
                console_logger.warn("%s : %s" % (__name__, str(e)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多