日志记录和电子邮件不适用于 Django 500
Posted
技术标签:
【中文标题】日志记录和电子邮件不适用于 Django 500【英文标题】:Logging and email not working for Django for 500 【发布时间】:2016-11-03 00:43:28 【问题描述】:我无法在我的 Django Web 应用程序中进行日志记录。
我的设置文件如下所示:
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 465
EMAIL_HOST_USER = "paulhtremblay@gmail.com"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = "paulhtremblay@gmail.com"
SERVER_EMAIL = 'smtp.gmail.com'
ADMINS = (
('Paul Tremblay', 'paulhtremblay@gmail.com'),
)
LOGGING =
'version': 1,
'disable_existing_loggers': False,
'handlers':
'file':
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': '/var/log/django_logs/debug.log'
,
'mail_admins':
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
,
,
'loggers':
'django':
'handlers': ['file'],
'level': 'ERROR',
'propagate': True,
,
'django.request':
'handlers': ['file'],
'level': 'ERROR',
'propagate': True,
,
,
我的视图文件中有这个:
def five_hundred_test(request):
raise ValueError("raising this on purpose for testing for 500")
return render(request, 'my_test/basic_css.html')
当我将浏览器指向此功能时,我收到 500 错误(如预期的那样),但没有任何内容发送到我的电子邮件,也没有任何内容放入日志文件中。我正在使用带有 python3 的 Django 1.9,使用 Apache 来运行服务器。
【问题讨论】:
如果您正确粘贴代码,LOGGING =
之前的空格太多。在任何情况下,您都应该始终从控制台添加错误回溯。
我一定没有正确粘贴。我还看到“记录”之前有太多空间。但是,代码不会引发任何错误(所以我不能包含跟踪)。它只是没有做它应该做的事情。
您的环境变量有错误:SERVER_EMAIL 收到一个电子邮件地址。我会相应地更新我的答案。
【参考方案1】:
这是我的工作设置。我没有添加console logger
,因为我只在生产中使用它。灵感来自 Django 文档的相关Logging Examples。
这是我的电子邮件和日志设置,这里是相关django docs for the email backend的链接:
from os.path import join
# Email Configuration ==========================================================
ADMINS = [('Me', 'my@email'), ]
MANAGERS = ADMINS
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = 'My Name To Display <my@email>'
SERVER_EMAIL = 'error_from@email'
EMAIL_HOST = 'smtp.server' # An IP may work better
EMAIL_HOST_USER = 'username_for_login'
EMAIL_HOST_PASSWORD = 'password_for_login'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
# Logging Configuration ========================================================
LOGGING =
'version': 1,
'disable_existing_loggers': False,
'formatters':
'verbose':
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
,
'simple':
'format': '%(levelname)s %(message)s'
,
,
'handlers':
'file':
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': join(HOME_DIR, 'my_logs', 'debug.log'),
'formatter': 'verbose'
,
'mail_admins':
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'formatter': 'simple'
,
,
'loggers':
'django':
'handlers': ['file'],
'level': 'ERROR',
'propagate': True,
,
'django.request':
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
,
,
我发现您的环境变量有两个错误:
SERVER_EMAIL
设置必须是电子邮件地址。
您使用的是TLS
,因此正确的端口应该是587。
此外,您正在尝试将 Google 用作 SMTP 服务器,但根据updated answer,此服务不再可从 google 获得,您必须搜索另一个 SMTP 服务器。
如果您需要使用,我还有assembled a post 提供了一些调试技术。
【讨论】:
【参考方案2】:这可以更简单地完成。如果您想同时登录到电子邮件和 Apache 日志文件,您需要在 settings.py
中执行以下操作:
配置电子邮件设置 - 这确保 Django 可以发送电子邮件
SERVER_EMAIL = 'me@me.eu'
EMAIL_HOST = 'smtp.me.eu'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = SERVER_EMAIL
EMAIL_HOST_PASSWORD = 'password'
将DEBUG
设置为False
- 这会启用错误电子邮件发送
DEBUG = False
将错误电子邮件接收者添加到ADMINS
(您可能也需要MANAGERS) - 这指定谁接收错误电子邮件
ADMINS = (
('Me', 'me@me.eu'),
)
MANAGERS = ADMINS
最后,删除在禁用调试模式时不允许消息通过的默认控制台过滤器 - 这会使错误最终出现在 Apache 错误日志中
from django.utils.log import DEFAULT_LOGGING
# Assure that errors end up to Apache error logs via console output
# when debug mode is disabled
DEFAULT_LOGGING['handlers']['console']['filters'] = []
这必须在settings.py
中,因为在导入设置后将立即使用DEFAULT_LOGGING
配置日志记录。
如果您想添加对从您自己的代码进行日志记录的支持,请同时在 settings.py
中配置根记录器:
# Enable logging to console from our modules by configuring the root logger
DEFAULT_LOGGING['loggers'][''] =
'handlers': ['console'],
'level': 'INFO',
'propagate': True
最后,您可能想要打开详细日志记录:
# Detailed log formatter
DEFAULT_LOGGING['formatters']['detailed'] =
'format': 'levelname asctime pathname:funcName:lineno message',
'style': '',
DEFAULT_LOGGING['handlers']['console']['formatter'] = 'detailed'
然后您可以按如下方式使用它:
log = logging.getLogger(__name__)
log.info('Logging works!')
【讨论】:
【参考方案3】:还要检查您的电子邮件客户端规则,了解电子邮件到达后如何处理。
我的电子邮件客户端中有一些规则有错误,它们正在阻止我的 Django 记录邮件进入/显示。
【讨论】:
以上是关于日志记录和电子邮件不适用于 Django 500的主要内容,如果未能解决你的问题,请参考以下文章
Django-Q 设置 Q_CLUSTER 'sync': True 不适用于单元测试
django-templated-email 不适用于 heroku
Spring Security 3 日志记录不适用于 Eclipse 中的 GAE
docker-compose 日志记录不适用于 syslog 选项