Gunicorn未记录HTTP请求问题:配置及与Django日志对比
解决Gunicorn运行Django时不输出HTTP请求日志的问题
我来帮你搞定这个问题!当用Gunicorn替代Django自带的runserver时,默认确实不会输出和runserver一模一样的GET/POST请求日志——这是因为两者的日志体系是分开的,下面给你两种可行的解决方案:
方案1:自定义Gunicorn的Access日志格式
你已经在启动命令里加了--access-logfile=-(把日志输出到控制台),但默认的日志格式和Django runserver的不一样。可以通过自定义格式让它输出接近的内容:
方式A:在启动命令中添加参数
直接修改你的启动命令,加上日志格式参数:
$VIRT_ENV/gunicorn -c config.py utrade.wsgi:application \ --log-level=debug \ --timeout=0 \ --access-logfile=- \ --log-file=- \ --access-logformat='%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s'
这个格式会输出类似这样的日志:
127.0.0.1 - - [10/Oct/2024:14:32:00 +0000] "GET / HTTP/1.1" 302 0
方式B:在Gunicorn的config.py中配置
如果习惯用配置文件管理,在config.py里添加以下内容:
accesslog = '-' # 输出到stdout access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s'
方案2:让Django自己输出请求日志
Django runserver的请求日志来自django.server这个日志器,在Gunicorn环境下它默认不会激活,你可以修改Django项目的settings.py中的LOGGING配置来开启它:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.server': { 'handlers': ['console'], 'level': 'INFO', 'propagate': False, }, }, }
配置后就能看到和runserver完全一样的日志输出了,比如:
INFO:django.server:"GET / HTTP/1.1" 302 0
INFO:django.server:"GET /login/?next=/ HTTP/1.1" 200 5676
注意事项
- 两种方案选一种即可,同时开启会导致请求日志重复输出。
- Gunicorn的access日志和Django的
django.server日志侧重点不同:前者更偏向WSGI层面的请求记录,后者是Django框架内部的请求日志,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者garg10may
相关产品推荐
相关产品推荐

