You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务器错误的任何线索...

几个实用的排查方向(都是生产环境踩过的坑)

  • 先搞定日志不记录的问题,不然排查全靠瞎猜:

    1. 别光看目录权限,检查日志文件本身的权限!如果文件已经存在,要确保运行Django的用户(比如www-data、uwsgi用户)有写入权限。可以用ls -l /home/bills/alvar/myapp/dapp.log查看,要是权限不对就手动改:chown [你的应用用户] /home/bills/alvar/myapp/dapp.log。如果文件还没创建,先手动建一个再给权限试试。
    2. 临时调低日志级别试试:把配置里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
      },
      
    3. 确认Django加载的是你修改的settings.py:生产环境经常会有多个配置文件(比如settings_prod.py),可以在服务器上跑python manage.py shell,然后输入from django.conf import settings; print(settings.LOGGING),看看配置是不是真的生效了。
  • 针对图片保存失败的具体排查:

    1. 检查生产环境的MEDIA_ROOT和MEDIA_URL:本地的路径在生产环境大概率不适用,要确保MEDIA_ROOT指向的目录存在且应用用户有写入权限。比如你本地用的是./media,生产环境可能要改成/home/bills/alvar/myapp/media,别直接复制本地配置。
    2. 检查表单提交的关键细节:模板里的form标签有没有加enctype="multipart/form-data"?视图里处理表单的时候有没有把request.FILES传进去?比如form = PictureForm(request.POST, request.FILES),少了request.FILES的话,文件根本不会被提交,本地可能因为测试环境宽松没暴露,但生产环境直接炸。
    3. 手动在生产环境的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 08:54:32