Django : crash log

DjangoはDEBUGモード(DEBUG=True)では,クラッシュ時にデバッグの為の詳細なスタックトレースをブラウザに表示してくれる. だけど,プロダクション環境でDEBUGモードをFalseに設定した途端,requestの処理中に何か例外が発生し,クラッシュしてもログに何も出力してくれなくなる.さすがにログがないと,何か問題が発生した際に原因を追いようがないので,対処をメモ.

検索するといくつか解決策がでてくるけれど,一番分かりやすかった下記で,今回は対処することにした.

Note that using logging.exception('Some message') with python's standard logging module works just fine in a sginal handler for got_request_exception, if all you are looking to do is log out stack traces. In other words, the traceback is still available in got_request_exception. – TM. Feb 14 '11 at 23:02

python - How do you log server errors on django sites - Stack Overflow

上記を実装したコードが下記になる.signalを使うので,適当なmodels.pyに追加した.

from django.core.signals import got_request_exception
import logging

logger = logging.getLogger("app")

def exception_logging(sender, **kwargs):
    logger.exception("[%s]" % kwargs["request"].get_full_path())

got_request_exception.connect(exception_logging)

上で何をしているか簡易に説明すると

django.core.signals.got_request_exception

はrequestの処理中に例外が発生した際に送信され *1

Logging.exception

スタックトレースをログに出力する *2 だけなので,上のコードは例外が発生した際のスタックトレースをログに出力していることになる. スタックトレースがそのままログに出力されるので,あまり綺麗とは言えないけれど,当面の目的としては十分なので,今のところは上記で様子を見ようと思う.

本当はDjango側で用意して貰えると,一番なんだけれど.