0

1.3 の Django のロギング メカニズムを介してエラー メールをセットアップしました。エラーが発生したときに素敵なメールを送ってくれます。ただし、単純なエラー メッセージをログに記録すると、フォーマットが奇妙になり、その理由がわかりません。

たとえば、私のアプリには、DB に何かが存在しない場合に知りたいという条件がありますが、正常に機能する適切なデフォルト値があります。したがって、いくつかの情報を記載した電子メールが送信されます。必ずしも例外で発生しているわけではありません。

私がこのようなことをすると:

logger.error("アクション %s の料金がデータベースに存在しませんでした", "actionX")

ログファイルの情報は問題ありませんが、電子メールにはいくつかの情報が欠けています。件名は次のとおりです。

[Django] ERROR: Test this jazz %s

そして本体:

None

Request repr() unavailable

私の質問は、A) 件名に表示される値を取得し、B) 本文に実際の関連情報を取得するにはどうすればよいかということです....行番号など.

4

2 に答える 2

4

次の 2 つのことを認識する必要があります。

  1. Python の組み込みログ システムを使用してメールを送信し、
  2. 通常の例外をログに記録していないため、渡される例外タイプのようなオブジェクトとトレースバックに保存されるものに依存しているため、電子メールを送信するための組み込みメカニズムは機能しません。

とにかく、不可能ではありません!

LOGGING = {
   ...
   'handlers': {
        ...
        'my_special_mail_handler': {
            'level': 'ERROR',
            'filters': [],
            'class': 'myapp.loggers.MyEmailHandler',
            'include_html': False,
        },
    },
    'loggers': {
        ...
        'my_special_logger': {
            'handlers': ['console', 'my_special_mail_handler'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

MY_RECIPIENTS = (("Name of person", "email@example.com"),)

...その内容は設定にマージされます。

次に、特別なログ クラス MyEmailHandler があります。

from django.utils.log import AdminEmailHandler
from django.core.mail.message import EmailMultiAlternatives
from django.conf import settings

class MyEmailHandler(AdminEmailHandler):

    def emit(self, record):
        if not getattr(settings, "MY_RECIPIENTS", None):
            return
        subject = self.format_subject(record.getMessage())
        message = getattr(record, "email_body", record.getMessage())
        mail = EmailMultiAlternatives(u'%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject),
                    message, settings.SERVER_EMAIL, [a[1] for a in settings.MY_RECIPIENTS],)
        mail.send(fail_silently=False)

これで、次の方法で電子メールで送信され、端末に出力される特別なログ エントリを作成できるようになりました。

import logging
logger = logging.getLogger("my_special_logger")
error = logger.makeRecord(
    logger.name, logging.ERROR, 0, 0,
    u"Subject: Some error occured",
    None, None, "", None,
)
error.email_body = msg
logger.handle(error)

簡単にするために、ユーティリティ関数を使用します。

import logging
def my_log(msg, body, level=logging.ERROR):
    logger = logging.getLogger("my_special_logger")
    error = logger.makeRecord(
        logger.name, level, 0, 0,
        u"Subject: Some error occured",
        None, None, "", None,
    )
    error.email_body = msg
    logger.handle(error)
于 2012-12-18T19:26:25.320 に答える
0

Django Logging ドキュメントの状態:

もちろん、ロギング呼び出しをコードに入れるだけでは十分ではありません。また、ロギング出力が有用な方法で出力されるように、ロガー、ハンドラー、フィルター、およびフォーマッターを構成する必要があります。

logging.config()辞書の設定を微調整する必要があります。これにより、必要な情報とフォーマット方法を正確に設定できます。

ドキュメントから少し切り取る:

'formatters': {
    'verbose': {
        'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
    },

出力にどのように影響を与えることができるかについてのアイデアが少し得られます.pythonのlogging.configドキュメントは、利用可能なオプションを記入します.

于 2012-04-05T08:29:04.633 に答える