184

そのため、開発で遊んでいるときに設定settings.DEBUGするだけTrueで、エラーが発生した場合は、適切なスタック トレースと要求情報を使用して適切にフォーマットされていることがわかります。

しかし、ある種の本番サイトではDEBUG=False、標準エラー 500 ページを使用して、現時点でこのバグの修正に取り組んでいるという情報を訪問者に表示したいと思います ;)
同時に、すべてをログに記録する何らかの方法が必要です。これらの情報 (スタック トレースとリクエスト情報) をサーバー上のファイルに保存します。コンソールに出力して、エラーのスクロールを確認したり、1 時間ごとにログをメールで送信したりできます。

これらの単純な要件を満たす、django サイトに推奨するロギング ソリューションは何ですか? アプリケーションをサーバーとして実行しておりfcgi、フロントエンドとしてApache Webサーバーを使用しています(lighttpdに行くことを考えていますが)。

4

7 に答える 7

106

の場合DEBUG = False、Django はエラーの完全なトレースバックを設定にリストされている各人に自動的にメールで送信しADMINSます。これにより、ほとんど無料で通知を受け取ることができます。よりきめ細かい制御が必要な場合はprocess_exception()、発生した例外にアクセスできるという名前のメソッドを定義するミドルウェア クラスを作成して設定に追加できます。

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

メソッドprocess_exception()は、コンソールへの書き込み、ファイルへの書き込みなど、任意のタイプのログを実行できます。

got_request_exception編集: あまり便利ではありませんが、リクエスト処理中に例外が発生するたびに送信されるシグナルをリッスンすることもできます。

http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception

ただし、これでは例外オブジェクトにアクセスできないため、ミドルウェア メソッドを使用する方がはるかに簡単です。

于 2008-10-26T14:53:31.147 に答える
81

すでに述べたように、Django Sentry は良い方法ですが、(別の Web サイトとして) 適切にセットアップするには少し作業が必要です。すべてを単純なテキスト ファイルに記録するだけの場合は、次のログ構成を使用します。settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}
于 2011-06-18T11:58:01.903 に答える
40

別の回答で言及されているdjango-db-logは、次のものに置き換えられました。

https://github.com/dcramer/django-sentry

于 2010-11-16T20:34:56.797 に答える
30

明らかに James は正しいですが、例外をデータストアに記録したい場合は、いくつかのオープン ソース ソリューションが既に利用可能です。

1) CrashLog は良い選択です: http://code.google.com/p/django-crashlog/

2) Db-Log も良い選択です: http://code.google.com/p/django-db-log/

2つの違いは何ですか?ほとんど何も見えないので、どちらかで十分です。

私は両方を使用しましたが、うまく機能します。

于 2008-10-27T13:33:44.160 に答える
16

EMP が最も役立つコードを提出してからしばらく経ちました。私はちょうど今それを実装し、バグを追跡しようとするためにいくつかのmanage.pyオプションをいじり回しているときに、現在のバージョンのDjango(1.5.?)ではrequire_debug_falseフィルターが現在mail_admins ハンドラーに必要です。

改訂されたコードは次のとおりです。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
            'filters': ['require_debug_false'],
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/home/username/public_html/djangoprojectname/logfilename.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'DEBUG', # Or maybe INFO or WARNING
            'propagate': False
        },
    },
}
于 2013-10-09T08:51:51.597 に答える