特定API的自定义Django日志过滤器

2024-09-28 21:50:50 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的应用程序中,有一个名为“UserChangeWorkScheduleViewSet”的API,其uri为“host/API/v1/workSchedule”。我一直在尝试创建一个自定义日志过滤器,每当用户导致400状态代码时,该过滤器都会向我发送错误日志。下面是“workschedule.py”中的UserChangeWorkScheduleViewSet:

class UserChangeWorkScheduleViewSet(viewsets.ModelViewSet):
    queryset = UserChangeWorkSchedule.objects.all()
    serializer_class = UserChangeWorkScheduleSerializer
    permission_classes = (IsAuthenticated,)

    def create(self, request, *args, **kwargs):
        UserChangeWorkSchedule.objects.filter(user=request.user.id).update(status=0)

        is_many = isinstance(request.data, list)
        if not is_many:
            request.data['user'] = request.user.id
            return super().create(request)
        else:
            for data in request.data:
                data['user'] = request.user.id

            serializer = self.get_serializer(data=request.data, many=True)
            if serializer.is_valid(raise_exception=True):
                self.perform_create(serializer)
                headers = self.get_success_headers(serializer.data)
                return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
            else:
                print('UserChangeWorkScheduleViewSet', request.user.id, serializer.errors)
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这是我的customlog.py:

import logging

class UserChangeWorkScheduleViewSet400(logging.Filter):

    def filter(self, record):
        record.levelname == 400
        record.filename == "workschedule.py"
        return True

这是设置中的日志记录

from api import customlog

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        },
        'only_400_from_workschedule': {
            '()': customlog.UserChangeWorkScheduleViewSet400
        },
    },
    'formatters': {
        'simple_trace': {
            'format': '%(asctime)s %(levelname)s %(filename)s %(funcName)s %(message)s',
        }
    },
    'handlers': {
        'telegram': {
            'class': 'telegram_handler.TelegramHandler',
            'token': '1489551033:AAHbIvspcVR5zcslrbrJ9qNK2yZ1at0yIMA',
            'chat_id': '-429967971',
            'formatter': 'simple_trace',
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['telegram'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}

我故意发送了一个错误的请求来筹集400英镑,结果400英镑出现了: [![在此处输入图像描述][1][1]

然而,我仍然没有收到电报日志。电报日志对于其他错误(如500)工作正常

重要提示:此记录器必须记录workschedule.py中的其他500错误和400错误。如果该设置仅记录workschedule.py的400,则记录将不会有用。 [1] :https://i.stack.imgur.com/eedI7.png


Tags: pyselfidtruedatareturnrequeststatus