django.server日志器功能解析及API请求日志配置相关疑问
关于Django日志器
django.server的功能及API请求日志配置解答 嘿,我来帮你把这些关于Django日志的疑问掰扯清楚:
一、django.server的实际作用到底是什么?
一句话总结:它只服务于你用python manage.py runserver启动的开发服务器,生产环境里用的Gunicorn、uWSGI这类WSGI服务器完全不会用到它。
具体来说,它会记录开发服务器接收到的每一个请求的处理信息:
- 正常的请求(非4XX/5XX状态码)会以
INFO级别输出,内容包含请求方法、URL路径、响应状态码、处理时长 - 4XX类响应(比如404找不到资源、403权限不足)会以
WARNING级别记录 - 5XX类服务器错误会以
ERROR级别记录
你之前禁用它但日志没变化,大概率是因为你的项目不是用runserver启动的——生产环境下这个日志器本来就不会工作,所以禁用它自然看不到任何效果~
二、仅用django根日志器能满足记录API请求的需求吗?
绝对不行!django是所有Django子日志器的根节点,它会接收所有子日志器(比如django.db、django.admin、django.request等)的日志内容,范围太宽泛了,会把ORM操作、后台管理操作这些你不需要的日志也一起打出来,根本做不到只精准记录API请求。
三、怎么配置只记录所有API请求的日志器?
分两种场景来配置:
1. 开发环境(用runserver启动)
直接单独启用django.server,同时禁用其他请求相关的日志器,避免重复记录:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.server': { 'handlers': ['console'], 'level': 'INFO', 'propagate': False, # 不让日志往上传给根日志器 }, # 禁用django.request,避免重复打请求日志 'django.request': { 'handlers': [], 'propagate': False, }, }, }
2. 生产环境(用WSGI服务器)
生产环境下django.server完全没用,得靠django.request来记录请求,还可以加个过滤器只保留API路径的请求:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { # 自定义过滤器,只保留路径以/api/开头的请求 'api_only': { '()': 'django.utils.log.CallbackFilter', 'callback': lambda record: record.path.startswith('/api/') } }, 'handlers': { 'api_log_file': { 'class': 'logging.FileHandler', 'filename': '/var/log/django/api_requests.log', # 换成你的日志路径 }, }, 'loggers': { 'django.request': { 'handlers': ['api_log_file'], 'level': 'INFO', 'filters': ['api_only'], 'propagate': False, }, # 生产环境直接禁用django.server就行 'django.server': { 'handlers': [], 'propagate': False, }, }, }
额外提醒:官方文档说过,被记录到django.security的请求不会被django.request记录,如果你的API涉及安全相关的请求(比如CSRF验证失败),需要单独配置django.security日志器来捕获这些内容。
内容的提问来源于stack exchange,提问作者anantdd
相关产品推荐
相关产品推荐

