如何将Django应用的错误日志内容发送至指定邮箱?
Django应用错误日志邮件通知实现方案
一、优先使用Django内置日志配置(推荐)
Django自带的日志系统可直接配置SMTP handler,无需编写复杂中间件,就能捕获所有写入错误日志的信息并发送邮件。
1. 配置邮件基础参数(settings.py)
在settings.py中设置邮件发送相关参数,以Gmail为例(其他邮箱替换对应SMTP信息):
# 邮件后端配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # SMTP服务器地址,例如Gmail为smtp.gmail.com,QQ邮箱为smtp.qq.com EMAIL_HOST = 'smtp.example.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True # 发件邮箱账号 EMAIL_HOST_USER = 'your-email@example.com' # 邮箱密码(Gmail需使用应用专用密码) EMAIL_HOST_PASSWORD = 'your-email-password' # 接收错误通知的管理员邮箱 ADMINS = [('Your Name', 'notify-email@example.com')]
2. 配置日志系统(settings.py)
添加或修改LOGGING配置,将ERROR级别以上的日志发送至管理员邮箱:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, # 日志格式定义 'formatters': { 'verbose': { 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}', 'style': '{', }, }, # 过滤器:仅在DEBUG=False时发送邮件(避免开发环境干扰) 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', }, }, # 日志处理器:定义邮件发送规则 'handlers': { 'mail_admins': { 'level': 'ERROR', # 仅捕获ERROR及以上级别日志 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler', 'formatter': 'verbose', 'include_html': True, # 可选:发送HTML格式邮件,包含请求上下文、回溯信息 }, 'console': { # 同时保留控制台输出,方便调试 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'verbose', }, }, # 日志记录器:指定哪些日志需要被处理 'loggers': { 'django': { # 捕获Django核心框架的错误 'handlers': ['console', 'mail_admins'], 'level': 'INFO', 'propagate': True, }, 'django.request': { # 捕获请求相关的500/400错误 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': False, }, 'your_app_name': { # 替换为你的应用名称,捕获应用内的业务错误 'handlers': ['console', 'mail_admins'], 'level': 'ERROR', 'propagate': True, }, }, }
3. 测试配置
将settings.py中的DEBUG设为False(符合过滤器规则),然后故意触发一个错误(比如在视图中抛出异常):
def test_error_view(request): raise ValueError("测试错误:触发邮件通知")
访问该视图后,检查管理员邮箱是否收到错误通知邮件。
二、Python Anywhere部署注意事项
- 确保邮件服务器地址和端口可被Python Anywhere访问,大部分公共SMTP服务(如Gmail、QQ邮箱)均支持。
- 若使用Gmail,需开启两步验证并创建应用专用密码,不能直接使用邮箱登录密码。
- 若邮件发送失败,可查看Python Anywhere的日志文件:
/var/log/www.your-username.pythonanywhere.com.error.log或应用的日志目录。
三、可选:自定义中间件捕获未处理异常
如果需要针对视图层的未处理异常做特殊处理,可以编写简单中间件(但推荐优先使用日志配置,覆盖范围更广):
# 在你的应用目录下创建middleware.py import logging import traceback from django.core.mail import mail_admins from django.http import HttpResponseServerError logger = logging.getLogger(__name__) class ExceptionEmailMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): return self.get_response(request) def process_exception(self, request, exception): # 记录异常到日志 logger.error("未处理异常", exc_info=exception) # 发送自定义邮件 subject = f"应用异常:{request.path}" message = f"请求路径:{request.path}\n\n异常信息:{str(exception)}\n\n回溯信息:\n{traceback.format_exc()}" mail_admins(subject, message, fail_silently=False) # 返回500错误页面 return HttpResponseServerError("服务器内部错误")
然后在settings.py的MIDDLEWARE列表中添加该中间件:
MIDDLEWARE = [ # 其他中间件... 'your_app_name.middleware.ExceptionEmailMiddleware', ]
内容的提问来源于stack exchange,提问作者Tony Suffolk 66
相关产品推荐
相关产品推荐

