Django3+Nginx+Gunicorn+Supervisor生产环境无法记录500错误日志
问题排查与解决方案
核心问题点
- Django日志配置缺失必要规则:仅配置了
django根日志,未覆盖处理请求异常的django.request日志器,也没有兜底的根日志器捕获所有未处理异常,同时缺失格式化配置无法输出完整回溯栈。
- Django日志配置缺失必要规则:仅配置了
- 权限问题:运行gunicorn的用户和日志目录所属用户可能不匹配,导致FileHandler无法写入日志文件。
- 服务运行用户冲突:supervisor配置的运行用户为root,但是gunicorn启动时切换为my_user,容易产生权限混乱。
调整步骤
1. 修正Django settings.py的LOGGING配置
替换原有LOGGING配置为以下内容:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}\n{exc_info}', 'style': '{', }, }, 'handlers': { 'file': { 'level': 'INFO', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs/django.log'), 'formatter': 'verbose', }, 'console': { 'class': 'logging.StreamHandler', 'formatter': 'verbose', }, }, 'loggers': { 'django': { 'handlers': ['console', 'file'], 'level': os.getenv('DJANGO_LOG_LEVEL', 'ERROR'), 'propagate': True, }, # 专门处理请求异常的日志器,500错误会被这个捕获 'django.request': { 'handlers': ['console', 'file'], 'level': 'ERROR', 'propagate': True, }, # 根日志器兜底,捕获所有未匹配的异常 '': { 'handlers': ['console', 'file'], 'level': 'ERROR', } }, }
2. 修正日志目录权限
执行以下命令确保日志目录权限正确:
mkdir -p /home/my_user/rpg-django/logs chown -R my_user:my_user /home/my_user/rpg-django/logs
3. 修正supervisor配置
修改/etc/supervisor/conf.d/rpg-django.conf中的user配置,和gunicorn运行用户保持一致:
user=my_user
4. 重启所有服务生效
执行以下命令重启服务:
supervisorctl reread supervisorctl update supervisorctl restart RPG-DJANGO
调整完成后再次访问测试视图,即可在logs/django.log或者logs/prod_gunicorn.log中看到完整的500错误回溯信息。
内容的提问来源于stack exchange,提问作者DeemonRider
相关产品推荐
相关产品推荐

