3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Djangoで500が出たらエラー内容のログを取る。または通知。

Last updated at Posted at 2021-01-29

環境

  • 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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?