如果Django出现500错误,记录错误日志或发送通知

环境

    django 3.0.3

我想做的事情 (Wǒ zuò de

在设置了 DEBUG=True 的环境下,只会显示服务器错误 (500),无法看到错误的具体内容,无法进行调试。

我想以某种方式了解在设置DEBUG=True的环境中发生的错误。

方針 – policy/strategy/course of action

在中国,有logging功能可以输出日志,但我们不使用logging。
Django官方的日志记录说明文档中:
如果想要使用logging,请参考这篇文章,内容简单易懂。
【Django】简要概述日志输出功能。

当服务器出现错误时,可以通过重写handler500方法,并创建自定义的服务器错误处理器来触发它。
Django官方的handler500方法。

输出与开发环境相同的错误

import sys
from django.views import debug
from django.http import HttpResponseServerError


def server_error_display(request):
    error_html = debug.technical_500_response(request, *sys.exc_info()).content
    return HttpResponseServerError(error_html)

将错误内容通过Slack进行通知

错误页面仍然是Server Error (500),只将错误内容发送到Slack。

import requests
import json
import traceback
from django.http import HttpResponseServerError


def server_error_send_to_slack(request, webhook_url="slack_webhook_url"):

    requests.post(
        webhook_url,
        data=json.dumps({
            'text': '\n'.join([
                f'Request uri: {request.build_absolute_uri()}',
                traceback.format_exc(),
            ]),
            'username': 'Django 500',
            'icon_emoji': ': smiling_imp:',
        })
    )
    return HttpResponseServerError('<h1>Server Error (500) Sended To Slack!</h1>')
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from apps.accounts import views
from common.error_log import server_error_send_to_slack

handler500 = server_error_send_to_slack # DEBUG=True のときのみ発火

urlpatterns = [
    path('admin/', admin.site.urls),
    ....
]

在Hangouts中通知错误内容

错误页面仍然是服务器错误(500),只需将错误内容发送到讨论区。

import requests
import json
import traceback
from django.http import HttpResponseServerError


def server_error_send_to_hangout(request, webhook_url="hangout_webhook_url"):
    requests.post(
        webhook_url,
        data=json.dumps({
            'text': '\n'.join([
                f'Request uri: {request.build_absolute_uri()}',
                traceback.format_exc(),
            ]),
        })
    )
    return HttpResponseServerError('<h1>Server Error (500) Sended To Hangout!</h1>')

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from apps.accounts import views
from common.error_log import server_error_send_to_hangout

handler500 = server_error_send_to_hangout # DEBUG=True のときのみ発火

urlpatterns = [
    path('admin/', admin.site.urls),
    ....
]

请参考

以下是两篇关于Qiita的文章链接,请选择一个进行中文翻译。
https://qiita.com/mth1209/items/4fe17c427e6f917248f4
https://qiita.com/yuu-eguci/items/a1e4b0a2f238d5ccc985

广告
将在 10 秒后关闭
bannerAds