在不使用Django自带的日志模块,我想把请求和响应信息使用自定义的日志模块记录下来,比如记录请求的请求地址、请求方法、请求路径、请求信息,返回状态码、返回内容长度,要如何做呢?
前面我写了一个日志装饰器,但是只能记录到我写入了视图的request,而无法记录接收到的所有request,于是我想到了用中间件,而Django自定义中间件也很简单。那么我们开始吧,自定义Django中间件记录请求和响应信息到日志中。
假设项目结构如下:
- Myproject
- Myproject
- __init__.py
- settings.py
- urls.py
- wsgi.py
- ...
- ...
request_middleware.py # 添加一个request_middleware.py
编辑自定义的中间件
为了能够同时记录请求信息和响应信息,我们在process_response
中将请求和响应信息都记录到日志中去:
from django.utils.deprecation import MiddlewareMixin
from Log.logging import Logger # 导入你自己的日志模块
logger = Logger()
class RequestMiddleware(MiddlewareMixin):
""" 日志记录请求 """
def process_response(self, request, response):
logger.info(f'Received Request: {request.META["REMOTE_ADDR"]} {request.method} "{request.META["PATH_INFO"]}'
f' {request.META["QUERY_STRING"]} {request.META["SERVER_PROTOCOL"]}" {response.status_code} {len(response.content)}')
return response # 一定要返回reponse
将中间件加入配置
编辑Myproject/setttings.py
:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
...
'request_middleware.RequestMiddleware' # 添加自定义的中间件
]
运行代码,就可以看到日志信息已经输出了:
2020-12-07 19:10:37,116 [request_middleware.py 9] : Received Request: 127.0.0.1 GET "/ HTTP/1.1" 200 858