如果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