我有一个中间件
import logging
request_logger = logging.getLogger('api.request.logger')
class LoggingMiddleware(object):
def process_response(self, request, response):
request_logger.log(logging.DEBUG,
"GET: {}. POST: {} response code: {}. response "
"content: {}".format(request.GET, request.DATA,
response.status_code,
response.content))
return response
问题是process_response方法中的请求没有.POST、.DATA或.body。我使用的是django-rest-framework,我的请求有Content-Type: application/json
请注意,如果我将日志记录放到process_request方法中-它具有.body和我需要的一切。但是,我需要在单个日志条目中同时包含请求和响应。
发布于 2014-07-17 23:28:12
这是我做的完整的解决方案
"""
Api middleware module
"""
import logging
request_logger = logging.getLogger('api.request.logger')
class LoggingMiddleware(object):
"""
Provides full logging of requests and responses
"""
_initial_http_body = None
def process_request(self, request):
self._initial_http_body = request.body # this requires because for some reasons there is no way to access request.body in the 'process_response' method.
def process_response(self, request, response):
"""
Adding request and response logging
"""
if request.path.startswith('/api/') and \
(request.method == "POST" and
request.META.get('CONTENT_TYPE') == 'application/json'
or request.method == "GET"):
request_logger.log(logging.DEBUG,
"GET: {}. body: {} response code: {}. "
"response "
"content: {}"
.format(request.GET, self._initial_http_body,
response.status_code,
response.content), extra={
'tags': {
'url': request.build_absolute_uri()
}
})
return response
请注意,这
'tags': {
'url': request.build_absolute_uri()
}
将允许您在哨兵中通过url进行过滤。
发布于 2015-08-27 05:25:23
Andrey的解决方案将在并发请求时中断。您需要将主体存储在request作用域中的某个位置,并在process_response().
中获取它
class RequestLoggerMiddleware(object):
def process_request(self, request):
request._body_to_log = request.body
def process_response(self, request, response):
if not hasattr(request, '_body_to_log'):
return response
msg = "method=%s path=%s status=%s request.body=%s response.body=%s"
args = (request.method,
request.path,
response.status_code,
request._body_to_log,
response.content)
request_logger.info(msg, *args)
return response
发布于 2015-08-15 03:23:34
令人沮丧和惊讶的是,Django中没有易于使用的请求日志记录包。
所以我自己创建了一个。查看:https://github.com/rhumbixsf/django-request-logging.git
使用日志记录系统,因此很容易配置。这是您使用调试级别得到的结果:
GET/POST request url
POST BODY if any
GET/POST request url - response code
Response body
https://stackoverflow.com/questions/24784985
复制相似问题