سؤال

I'm having problems with creating an access logger for my tastypie restfull app. I'd like to log several HTTP headers in requests to server and pass them to logger/handler defined in django Settings file. The idea is to log every HTTP request into a access log file.

I've encountered several logging modules (apps) but they all use database, I want something simpler for a basic access log.

هل كانت مفيدة؟

المحلول

I ended up making my own Middleware class in middleware.py inside application root.

Also I placed 'appname.middleware.RequestLoggerMiddleware', inside Settings.py Middleware section.

Here is the code for my access logging middleware class:

import logging

logger = logging.getLogger('access')

class RequestLoggerMiddleware(object):
    def process_request(self, request):
        ... logging logic here...

        logger.info('logging message'))
        return None

For more info about Middleware components see Django Middleware documentation.

نصائح أخرى

Another possibility is to override of the ModelResource.dispatch() method, in a custom ModelResource object:

class CustomModelResource(ModelResource):
    def dispatch(self, request_type, request, **kwargs):
        """
        Override for systematic logging.
        """
        log_user = request.META['USER']
        log_request_type = request_type
        log_resource_name = kwargs['resource_name']
        log_api_name = kwargs['api_name']
        log_response = {}

        try:
            response = super(CustomModelResource, self).dispatch(request_type, request, **kwargs)
            log_response['response_code'] = response.status_code
        # Also log what could go wrong
        except Exception, e:
            log_response['error_type'] = e.__class__.__name__
            log_response['error_message'] = e.message
            log_response['response_code'] = http.HttpBadRequest.status_code
            raise
        finally:
            # Log all the things
            logger.debug('%s asked for %s on %s through api %s: \n%s' % (
                log_user,
                log_request_type,
                log_resource_name,
                log_api_name,
                log_response,
            ))

        return response

class Meta:
    # Other custom stuff
import logging


logger = logging.getLogger('project.app.view')


def my_view(request):
    entry = '%s %s for %s' % (request.method, request.get_full_path(), request.META['REMOTE_ADDR'])
    logger.info(entry)

See https://docs.djangoproject.com/en/1.4/topics/logging/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top