環境
- django 3.0.3
やりたいこと
DEBUG=True
としている環境でのエラー画面は
Server Error (500)
とだけ出て、エラーの内容が見れない。
デバグができない。
DEBUG=True
としている環境で起きたエラーを何かしらの方法で知りたい。
方針
ログ出力にloggingがあるが、loggingは使わない。
Django 公式 ロギング
loggingを使いたい場合はこちらの記事がわかりやすい。
【Django】ログ出力機能について簡単にまとめる
サーバーエラーが出たときに発火するhandler500
を上書きして、自作のサーバーエラーハンドラーを作って発火させる。
Django 公式 handler500
開発環境と同じエラーを出す
common/error_log.py
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に送信。
common/error_log.py
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>')
urls.py
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),
....
]
ハングアウトにエラー内容を通知する
エラー画面は
Server Error (500)
のままで、エラーの内容だけハングアウトに送信。
common/error_log.py
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>')
urls.py
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),
....
]
参考
https://qiita.com/mth1209/items/4fe17c427e6f917248f4
https://qiita.com/yuu-eguci/items/a1e4b0a2f238d5ccc985