python - django2 - logging getlogger(' django request ')




Djangoの電子メールエラーレポートを手動で起動する (3)

Djangoのエラー報告では電子メールを送信して未知の例外を処理し、(オプションで)ユーザーに素晴らしい500エラーページを表示します。

これはうまくいきますが、ユーザーがビジネスを中断することなく継続できるようにしたいのですが、Djangoに例外に関する電子メールエラーレポートを送ってもらうことができます。

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

もちろん、私は手動でエラーレポートの電子メールを生成しないようにしたいと思います。


あなたの設定で簡単なログハンドラを設定するだけです。

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

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

また、 機密情報を管理する必要があります


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

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

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

これらのオプションのうち、オプション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のドキュメントに基づいていますが、テストされていません。

次に、追加のロガー設定は、ロガー項目に追加されます( here

'nameofdjangoapplicationgoeshere': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },

次のコードを使用して、 requestと例外に関する電子メールを手動で送信できます。

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)




django-errors