Django + Elastic Beanstalk,access_log 中有 500 个响应代码,但 error_log 中没有

Posted

技术标签:

【中文标题】Django + Elastic Beanstalk,access_log 中有 500 个响应代码,但 error_log 中没有【英文标题】:Django + Elastic Beanstalk, 500 Response codes in access_log but nothing in error_log 【发布时间】:2020-07-28 14:07:01 【问题描述】:

我使用 Django 在 Elastic Beanstalk(带有自动缩放负载均衡器)上设置了一个应用程序。该配置还使用了 apache httpd 和 mod_wsgi。

该应用程序运行正常,但我偶尔会看到一个错误,在我的一生中我无法调试。这是由于错误本身在任何时候都没有出现在 error_log 中。

访问日志中的一个示例,(IP 地址省略):

[15/Apr/2020:01:13:21 +0000] "GET /reroute/agument/ HTTP/1.1" 500 27 "-" ""
[15/Apr/2020:01:13:22 +0000] "GET /reroute/argument/ HTTP/1.1" 302 - "https://www.bing.com/" "Mozilla/5.0 (Linux; android 4.4.3; KFSOWI) AppleWebKit/537.36 (Khtml, like Gecko) Silk/80.5.3 like Chrome/80.0.3987.162 Safari/537.36"

顶部请求显示错误请求,底部请求是典型请求。我在这里注意到的主要事情是 500 请求中没有用户代理。梳理 access_log,这种类型的每个请求都缺少用户代理。我没有特定的功能设置来阻止机器人/蜘蛛等。

这 500 个错误是随机发生的,并且在过去几个月中一直如此。没有关于最终用户发生这些情况的报告,这使我相信有两种可能性:

    有人正在使用未在 Django 的 ALLOWED_HOSTS 设置中指定的错误主机。 不知何故,机器人/蜘蛛被拒绝了。

我真的很想识别并停止这些错误请求,因为它会影响应用程序本身的错误报告。在这里找出问题的最佳方法是什么?

我添加到我的 beanstalk 环境中的唯一功能(通过 .ebextensions)是:

将 Http 请求重定向到 Https 启动时运行的一些 Django 命令

【问题讨论】:

【参考方案1】:

好吧,那我就傻了。

这些错误消息没有出现在我的日志中的原因仅仅是因为它们没有办法在日志中显示。

在 Django settings.py 中设置一个简单的日志记录字典突然开始显示 500 个错误发生时的堆栈跟踪。从那里,我可以看到这是一个简单的未处理异常:

LOGGING = 
"version": 1,
"disable_existing_loggers": False,
"handlers": 
    "console": 
        "class": "logging.StreamHandler",
    ,
,
"loggers": 
    "django": "handlers": ["console"], "level": "INFO",
,

【讨论】:

以上是关于Django + Elastic Beanstalk,access_log 中有 500 个响应代码,但 error_log 中没有的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 上 Django/Celery 的权限问题

如何使用 django-elasticsearch-dsl 将 django-modeltranslation 创建的列索引为 Elastic?

AWS Elastic Beanstalk 上禁止使用 Django 403

Elastic Load Balancer 后面的 Elastic beanstalk 实例的 Django ALLOWED_HOSTS 设置

Elastic Beanstalk 没有看到 DATABASES 设置的变化 - Django

Django 频道 + Elastic Beanstalk