2012-11-19 74 views
2

我在为我的tastypie restfull应用程序创建访问记录器时遇到问题。 我想在服务器的请求中记录多个HTTP头,并将它们传递给在django设置文件中定义的记录器/处理程序。这个想法是将每个HTTP请求记录到访问日志文件中。记录Tastypie请求(访问日志)

我遇到了几个日志模块(应用程序),但他们都使用数据库,我希望更简单的基本访问日志。

回答

3

最后我使我自己的中间件类中的应用程序根middleware.py。

另外我在Settings.py中间件部分放置了'appname.middleware.RequestLoggerMiddleware',

这里是我的访问日志记录中间件类的代码:

import logging 

logger = logging.getLogger('access') 

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

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

欲了解更多信息有关中间件组件看到Django Middleware documentation

-2
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) 

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

+0

但我没有任何意见......我只是用资源从Tastypie。扩展现有类是唯一的解决方案吗? – lpandzic

+0

我认为我需要做的就是实现自己的中间件(https://docs.djangoproject.com/zh/dev/topics/http/middleware/?from=olddocs),process_request返回None。 – lpandzic

1

另一种可能性是覆盖ModelResource.dispatch()方法,在自定义ModelResource对象:

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 
+0

它可能是一个代理服务器,但是我在request.META ['USER']'上得到一个KeyError' – mlissner