さんまがおいしい季節だねー(´・ω・`)

Djangoの例外をウェブサーバのエラーログに表示する方法

Python — タグ: , — さくら @ 2011/08/23 17:04

先日このブログを移転する際に、Django の起動方法を CGI から FastCGI に変えました。(いきなりシレッと Django の話始めましたが AZlink が Django です。)

移転作業中にいくつか表示されないページがあり、明らかに内部でエラーが出てる感じだったのですが、既に公開した後だったので Django の DEBUG=True にして HTML にエラー表示する訳にもいかず(とか言いつつ一回 DEBUG=True にしちゃいましたけど)、nginx の error.log に例外を表示する方法は無いもんかとネットを漁っていたら驚愕の事実に突き当たりました…

Django を運用状態(DEBUG=False)で例外を補足する方法は用意されて無いらしいです。(´・ω・`)舐めてんの?

まー本体に用意されて無くても何か方法があるだろーってことで調べ続けてると django-crashlog ってーのを見つけまして、例外を保存するところまでは settings.py に MiddleWare を追加する形でできることが分かりました。

ただこれ、例外をデータベースに保存する MiddleWare らしく、Django の admin サイト立ち上げてないポックン的にはまったく使えない感じなのでdjango-crashlogのソースを参考に stderr に例外を表示する MiddleWare を自分で作ってみたのが↓です。

import sys
import traceback

class StderrLogMiddleware(object):
    def process_exception(self, request, exception):
        traceback.print_exc(None, sys.stderr)

ソース短いなー。これぐらいの物なら Django 本体に入れといてくれたら良いのに…

と愚痴っててもしゃーないので、StderrLogMiddleware.py という名前で PYTHONPATH の通った場所に保存してから、settings.py の MIDDLEWARE_CLASSES の下の方に追加します。

MIDDLEWARE_CLASSES = (
    #'django.middleware.gzip.GZipMiddleware',
    'django.middleware.http.ConditionalGetMiddleware',
    #'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.cache.FetchFromCacheMiddleware',
    #'django.contrib.sessions.middleware.SessionMiddleware',
    'StderrLogMiddleware.StderrLogMiddleware',
)

これで Django の view プログラムで例外が発生すると stderr に出力するようになります。( ゚∀゚)o彡゚長官たん!長官たん!

もっとややこいことしたい方は [Django][mod_wsgi]ログをとる あたりを参考にどうぞ。うちのサイト的には stderr で充分ですたい。

0 Comments »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URI

コメントする

Copyright © 2017 さくらたんどっとびーず | powered by WordPress with Barecity