Django生产环境500错误无日志记录及表单图片保存失败排查求助
Django生产环境500错误无日志记录及表单图片保存失败排查求助
我已经把下面的LOGGING配置复制到settings.py里,但没做其他额外配置:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { # Include the default Django email handler for errors # This is what you'd get without configuring logging at all. 'mail_admins': { 'class': 'django.utils.log.AdminEmailHandler', 'level': 'ERROR', # But the emails are plain text by default - HTML is nicer 'include_html': True, }, # Log to a text file that can be rotated by logrotate 'logfile': { 'class': 'logging.handlers.WatchedFileHandler', 'filename': '/home/bills/alvar/myapp/dapp.log' }, }, 'loggers': { # Again, default Django configuration to email unhandled exceptions 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True, }, # Might as well log any errors anywhere else in Django 'django': { 'handlers': ['logfile'], 'level': 'ERROR', 'propagate': False, }, # Your own app - this assumes all your logger names start with "myapp." 'myapp': { 'handlers': ['logfile'], 'level': 'WARNING', # Or maybe INFO or DEBUG 'propagate': False }, }, }目前处于生产环境,DEBUG已经设为False(按照要求配置的)。日志文件放在应用所有者有写入权限的目录,但就是没有任何内容写入。
问题出在提交表单之后:表单关联了address、property和pictures三个表,address和property能正常保存,但pictures完全没数据。本地开发环境一切正常,到生产环境就莫名失败了。
更新:感觉自己在StackOverflow上问的问题90%都找不到答案,连Sentry都没捕获到这个500服务器错误的任何线索...
几个实用的排查方向(都是生产环境踩过的坑)
先搞定日志不记录的问题,不然排查全靠瞎猜:
- 别光看目录权限,检查日志文件本身的权限!如果文件已经存在,要确保运行Django的用户(比如www-data、uwsgi用户)有写入权限。可以用
ls -l /home/bills/alvar/myapp/dapp.log查看,要是权限不对就手动改:chown [你的应用用户] /home/bills/alvar/myapp/dapp.log。如果文件还没创建,先手动建一个再给权限试试。 - 临时调低日志级别试试:把配置里
myapp的level改成DEBUG,django的level也改成DEBUG,另外把django.request的handler加上logfile,这样500错误的请求日志也会写到文件里,修改后的片段如下:'django.request': { 'handlers': ['mail_admins', 'logfile'], 'level': 'ERROR', 'propagate': True, }, 'myapp': { 'handlers': ['logfile'], 'level': 'DEBUG', # 临时调低看详细日志 'propagate': False }, - 确认Django加载的是你修改的settings.py:生产环境经常会有多个配置文件(比如settings_prod.py),可以在服务器上跑
python manage.py shell,然后输入from django.conf import settings; print(settings.LOGGING),看看配置是不是真的生效了。
- 别光看目录权限,检查日志文件本身的权限!如果文件已经存在,要确保运行Django的用户(比如www-data、uwsgi用户)有写入权限。可以用
针对图片保存失败的具体排查:
- 检查生产环境的
MEDIA_ROOT和MEDIA_URL:本地的路径在生产环境大概率不适用,要确保MEDIA_ROOT指向的目录存在且应用用户有写入权限。比如你本地用的是./media,生产环境可能要改成/home/bills/alvar/myapp/media,别直接复制本地配置。 - 检查表单提交的关键细节:模板里的form标签有没有加
enctype="multipart/form-data"?视图里处理表单的时候有没有把request.FILES传进去?比如form = PictureForm(request.POST, request.FILES),少了request.FILES的话,文件根本不会被提交,本地可能因为测试环境宽松没暴露,但生产环境直接炸。 - 手动在生产环境的shell里测试创建图片对象:比如跑
python manage.py shell,然后执行:
看看会不会报错,这样能快速定位是数据库的问题还是文件系统的问题。from myapp.models import Pictures from django.core.files.images import ImageFile # 找个测试图片的路径,比如上传一张临时图到服务器 pic = Pictures.objects.create(property=your_property_instance, image=ImageFile(open('/tmp/test.jpg', 'rb')))
- 检查生产环境的
关于Sentry没捕获到500错误:
有可能错误根本没到Django层面,比如Nginx/Apache这类反向代理服务器先报错了,这时候要去看服务器的错误日志(比如Nginx的/var/log/nginx/error.log)。另外确认Sentry的配置是不是真的生效了,比如有没有在settings.py里正确初始化,INSTALLED_APPS里有没有加相关模块?
备注:内容来源于stack exchange,提问作者Alvar
相关产品推荐
相关产品推荐

