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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:47:21