35

Django エラー レポートは、メールを送信してキャッチされなかった例外を処理し、(オプションで) ユーザーに適切な 500 エラー ページを表示します。

これは非常にうまく機能しますが、ユーザーがビジネスを中断せずに続行できるようにしたい場合もありますが、Django から例外に関する電子メール エラー レポートが送信されるようにします。

基本的に、例外をキャッチした場合でも、手動でエラーレポートを電子メールで送信できますか?

もちろん、エラー レポートの電子メールを手動で生成することは避けたいと思います。

4

6 に答える 6

41

次のコードを使用して、 arequestおよび exceptionに関する電子メールを手動で送信できeます。

import sys
import traceback
from django.core import mail
from django.views.debug import ExceptionReporter

def send_manually_exception_email(request, e):
    exc_info = sys.exc_info()
    reporter = ExceptionReporter(request, is_email=True, *exc_info)
    subject = e.message.replace('\n', '\\n').replace('\r', '\\r')[:989]
    message = "%s\n\n%s" % (
        '\n'.join(traceback.format_exception(*exc_info)),
        reporter.filter.get_request_repr(request)
    )
    mail.mail_admins(
        subject, message, fail_silently=True,
        html_message=reporter.get_traceback_html()
    )

次のようなビューでテストできます。

def test_view(request):
    try:
        raise Exception
    except Exception as e:
        send_manually_exception_email(request, e)
于 2015-04-26T13:54:50.903 に答える
6

設定で単純なログハンドラーをセットアップするだけです。

LOGGING = {
    'version': 1, 
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'app': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

そして、あなたの見解では、あなたは何でもすることができます

 import logging
 logger = logging.getLogger('app')

 def some_view(request):
     try:
         # something
         if something_wnet_wrong:
             logger.error('Something went wrong!')
         return some_http_response
     except:
         #something else
         logger.error(sys.exc_info(), request)        
         return some_other_response

詳細なエラー レポートが必要な場合は、次のようなものを試すことができます。

また、機密情報にも注意を払う必要があります。

于 2015-04-23T09:42:51.023 に答える
5

はい、例外をキャッチした場合でも、電子メール エラー レポートを手動で送信できます。

これにはいくつかの方法があります。

  1. すべてのエラー メッセージを mail_admins ハンドラに送信する django.requestの既存のデフォルト ロガー設定 (および関連するハンドラ設定) を使用できます。このハンドラは、django.request から log.error でログに記録されたものを送信します (debug が false の場合)。既存の呼び出しポイントが handle_uncaught_exception にあるAdminEmailHandler使用する電子メール。
  2. 同じハンドラーを使用する追加のロガー構成を追加して、django.request よりも早く例外をキャッチし、log.error をより早く呼び出すことができます。
  3. django.request、具体的には handle_uncaught_exception をサブクラス化できます。
  4. カスタム ミドルウェア (たとえば、 StandardExceptionMiddleware ) またはExceptionMiddlewareを使用できます。
  5. AdminEmailHandleremit inまたは mail.mail_adminsの内容を手動で直接呼び出すことができます。

これらのオプションのうち、オプション 4 が最も一般的に行われているようです。

コメントの追加情報に基づいて、2 のコード例を以下に示します。

まず、ビューに追加されるコード

from django.http import HttpResponse
import logging
logger = logging.getLogger(__name__)

def my_view(request):

    try:
        result = do_something()
        return HttpResponse('<h1>Page was found' + result + '</h1>')
    except Exception: 
         # Can have whatever status_code and title you like, but I was just matching the existing call.
         logger.error('Internal Server Error: %s', request.path,
            exc_info=sys.exc_info(),
            extra={
            'status_code': 500,
            'request': request
            }
         )
         return HttpResponse('<h1>Page was found, and exception was mailed to admins.</h1>')

これは、ビューの書き込みとDjango ロギングの紹介に関する Django ドキュメントに基づいていますが、テストされていません。

次に、追加のロガー構成が loggers エントリに追加されます (こちらのように)

'nameofdjangoapplicationgoeshere': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
于 2015-04-23T04:12:32.650 に答える