43

デバッグの目的で、Django のロギング メカニズムを使用して、着信リクエストが django-rest-framework の玄関先に「到着」したときにすべてのリクエストをログに記録したいと考えています。

Djagno は、次の方法で (「警告」ログ レベル以上の) 要求のログを提供します (settings.py の LOGGING セクションから)。

'django.request': {
        'handlers': ['mail_admins'],
        'level': 'ERROR',
        'propagate': False,
 },

私はこのようなことを達成しようとしています (注意: ログレベルは DEBUG です):

'rest_framework.request': {
        'handlers': ['logfile'],
        'level': 'DEBUG',
        'propagate': False,
 },

DRF のソース コードにロガーを埋め込まにそれを行う方法はありますか?
私が気付いていないDRFに、ある種の「ログバックエンド」オプションがあるのでしょうか?

4

9 に答える 9

33

を使用RequestLogMiddlewareして任意の Django にフックできるジェネリックを作成しました。Viewdecorator_from_middleware

request_log/ミドルウェア.py

import socket
import time


class RequestLogMiddleware(object):
    def process_request(self, request):
        request.start_time = time.time()

    def process_response(self, request, response):

        if response['content-type'] == 'application/json':
            if getattr(response, 'streaming', False):
                response_body = '<<<Streaming>>>'
            else:
                response_body = response.content
        else:
            response_body = '<<<Not JSON>>>'

        log_data = {
            'user': request.user.pk,

            'remote_address': request.META['REMOTE_ADDR'],
            'server_hostname': socket.gethostname(),

            'request_method': request.method,
            'request_path': request.get_full_path(),
            'request_body': request.body,

            'response_status': response.status_code,
            'response_body': response_body,

            'run_time': time.time() - request.start_time,
        }

        # save log_data in some way

        return response

request_log/mixins.py

from django.utils.decorators import decorator_from_middleware

from .middleware import RequestLogMiddleware


class RequestLogViewMixin(object):
    """
    Adds RequestLogMiddleware to any Django View by overriding as_view.
    """

    @classmethod
    def as_view(cls, *args, **kwargs):
        view = super(RequestLogViewMixin, cls).as_view(*args, **kwargs)
        view = decorator_from_middleware(RequestLogMiddleware)(view)
        return view

my_django_rest_api/views.py

from rest_framework import generics

from ...request_log.mixins import RequestLogViewMixin

class SomeListView(
    RequestLogViewMixin,
    generics.ListAPIView
):
    ...
于 2015-01-13T17:51:31.597 に答える
13

メソッドをオーバーライドして、APIView.initial()自分でログを追加します。

発送方法

次のメソッドは、ビューの .dispatch() メソッドによって直接呼び出されます。これらは、.get()、.post()、put()、patch()、.delete() などのハンドラー メソッドを呼び出す前後に必要なアクションを実行します。

.initial(self, request, *args, **kwargs)
ハンドラー メソッドが呼び出される前に発生する必要があるすべてのアクションを実行します。このメソッドは、アクセス許可とスロットリングを適用し、コンテンツ ネゴシエーションを実行するために使用されます。

于 2013-03-22T20:19:42.060 に答える