djangoサイトのサーバーエラーをどのように記録しますか
-
04-07-2019 - |
質問
だから、開発で遊んでいるときに settings.DEBUG
を True
に設定するだけで、エラーが発生した場合、適切なスタックトレースとリクエスト情報。
しかし、実稼働サイトの種類では、 DEBUG = False
を使用し、現時点でこのバグの修正に取り組んでいる情報を含む標準エラー500ページをビジターに表示します;)
同時に、これらのすべての情報(スタックトレースとリクエスト情報)をサーバー上のファイルに記録する方法が欲しいので、コンソールに出力してエラースクロールを見て、ログをメールで送ってください。 1時間ごと、またはこのようなもの。
これらの簡単な要件を満たす、Djangoサイトにはどのロギングソリューションをお勧めしますか?アプリケーションを fcgi
サーバーとして実行しており、Apache Webサーバーをフロントエンドとして使用しています(lighttpdへの移行を考えていますが)。
解決
まあ、 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
これは例外オブジェクトへのアクセスを しませんが、ミドルウェアメソッドを使用する方がはるかに簡単です。
他のヒント
既に述べたように、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
},
},
}
django-db-logは、次のように置き換えられました。
明らかにジェームズは正しいですが、データストアに例外を記録したい場合は、いくつかのオープンソースソリューションが既に利用可能です:
1)CrashLogは良い選択です: http://code.google.com/ p / django-crashlog /
2)Db-Logも良い選択です: http:// code.google.com/p/django-db-log/
この2つの違いは何ですか?私が見ることができるものはほとんどないので、どちらでも十分です。
両方を使用しましたが、うまく機能します。
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
},
},
}
fcgi
スクリプトで問題が発生しました。 djangoが始まる前に発生しました。ロギングの欠如はとても痛いです。とにかく、stderrを最初のファイルとしてファイルにリダイレクトすることは大いに役立ちました:
#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')