2012-04-05 5 views
0

1.3でDjangoのログ機能を使ってエラーメールをセットアップしました。エラーが発生したときに素晴らしいメールを送信します。しかし、シンプルなエラーメッセージを記録すると、それは奇妙にフォーマットされているのですが、私はなぜそれがわかりません。djangoの単純なエラーログメッセージ

たとえば、私の知る必要があるDBに何かが存在しない場合、私のアプリには条件がありますが、適切なデフォルト値があれば問題ありません。したがって、私はいくつかの情報で私にメールを送りたい。例外で必ずしも起こっているとは限りません。

私はこのような何か場合:

logger.error(「料金がアクション%sのデータベースに存在していなかった」、「actionX」)

をログファイル内の情報は結構ですが、電子メールは本当にいくつかの情報が欠けています。ここでは、件名の行です:

[Django] ERROR: Test this jazz %s 

そしてボディ:

None 

Request repr() unavailable 

私の質問には、対象とBに表示する値)IがAを得るのですか、である)いくつかは、実際の取得、関連します体の中の情報....行番号のようなものかそのようなもの。

+0

あなたのロガーの設定(settings.pyから)? – jvc26

答えて

4

あなたは二つのことを確認する必要があります。

あなたはPythonの組み込みロギングシステムと
  • 送信する電子メールのための組み込みのメカニズムが機能しませんので、あなたが定期的に例外をログに記録されていないを使用して電子メールを送信したい
    1. それは渡される例外型のようなオブジェクトとトレースバックに格納されるものに依存しているからです。

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

    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 protected]"),) 
    

    ...そのものはあなたの設定にマージされます。

    はその後、あなたの特別なロギングクラスがMyEmailHandlerは、あります:

    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) 
    

    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 
    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) 
    
  • +0

    多くの作業のように思えますが、私がやろうとしていることをより詳細に制御するためのスマートな方法です。ありがとう! – JamesD

    0

    Django Logging docs状態:もちろん

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

    logging.config()辞書で設定を微調整する必要があります。これにより、必要な情報とフォーマット方法を正確に設定することができます。ドキュメントから小さなビット切削

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

    は、あなたが出力に影響を与えることができる、とのpythonのためのlogging.configのドキュメントが利用可能なオプションを記入する方法のアイデアのビットを提供します。

    +0

    フォーマットは明らかに送信される電子メールに影響を与えません。あなたの答えは、私が設定した "ログファイル"内の実際のメッセージにしか関係していないようです。 – JamesD

    関連する問題