Django 错误日志:添加请求头、正文和用户信息

noa*_*ale 7 python django logging

寻找一种在我的错误日志中添加标题、正文和用户电子邮件地址的方法,以及我的views.py 中异常的堆栈跟踪

在网上搜索了几个小时后,许多人建议编写自己的中间件,有些人建议将此类信息记录到单独的日志中。然而,知道你的代码出错的地方解决了问题的一部分,确定它影响了哪个可怜的灵魂以及在该异常期间发送了哪些请求数据对于纠正问题有很长的路要走。将这些信息放在同一个日志文件中对我来说很有意义。

目前在我的 views.py 中,我有这个简单的设置:

from django.db.models import Min, Max, Q, F, Count, Sum
from django.db import connection
from django.conf import settings
from django.http import HttpResponse, HttpResponseRedirect
from myapp.models import *
import logging

logging.basicConfig(filename="errors.log",
                    level=logging.ERROR,
                    format='%(asctime)s: %(message)s')


def random_view(request):
    if request.user.is_authenticated() and request.user.is_active:
         # generic view code goes here.
    else:
        return HttpResponse(status=401)
Run Code Online (Sandbox Code Playgroud)

这种设置在一段时间内运行良好。每次出现异常时,它都会注销时间、异常错误消息和堆栈跟踪。

如何添加 request.META、request.user.id 和 request.body 以及堆栈跟踪?

任何建议都会有所帮助。一个有效的答案,甚至更好!

谢谢

小智 7

我认为您遇到的日志记录问题的完整解决方案是实现中间件。中间件将能够与您拥有的任何类型的视图实现一起工作,无论它是基于类的视图、基于函数的视图还是来自 DRF 的 APIView。

您可以为完整日志定义一个中间件。确保在身份验证中间件之后适当地放置中间件 -

MIDDLEWARE = [
    ...,
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...,
    'path.to.your.middleware.LogMiddleware'
]
Run Code Online (Sandbox Code Playgroud)

在日志中间件中,您可以访问请求和响应。您可以通过记录器存储请求、用户(如果经过身份验证)和来自请求的所有 META 属性,或者您甚至可以根据需要将其存储在数据库中。虽然,请注意存储在数据库中是有代价的。您可以通过阅读Django 中间件文档来了解如何编写中间件

import traceback

class LogMiddleware():
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        try:
            return self.get_response(request)
        except:
            if request.user.is_authenticated():
                # Log the user
            path = request.get_full_path() # Get the URL Path
            tb = traceback.format_exc() # Get the traceback
            meta = request.META # Get request meta information
            # Log everything
            raise  # Raise exception again after catching
Run Code Online (Sandbox Code Playgroud)

您可以从HttpRequest的 Django 文档中了解所有元属性。如果您需要对此进行任何澄清,请告诉我。