Jogging の DatabaseHandler だとロールバックしちゃって例外ロギングできなくね?と思ったら

TransactionMiddleware

Djangoトランザクションにおいて、TransactionMiddleware を使えば、 リクエストを受けてからレスポンスを返すまでをひとつのトランザクションとして 処理してくれるので楽ちんですよね:

# settings.py
MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.CacheMiddleware',
    'django.middleware.transaction.TransactionMiddleware',  # これ
)

Jogging の設定

さて、以前のポストで README を和訳したように、「Django でもログを取りたい! できれば管理画面で閲覧できるように、モデル化されてると使い勝手がいいな〜」 ということで Jogging の DatabaseHandler を使ってロギングしたりしています:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.CacheMiddleware',
    'django.middleware.transaction.TransactionMiddleware',
    'jogging.middleware.LoggingMiddleware',  # ここと
)

...

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions.backends.cache',
    'django.contrib.sites',
    'django.contrib.admin',
    # ...
    'jogging',  # ここを追加
    # ...
)

正しくは

ここで、「500エラーなんかは TransactionMiddleware でロールバックされちゃうから、 DB にログが残んないじゃん!」という状態になったのですが、まあ落ちつけと:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.CacheMiddleware',
    'jogging.middleware.LoggingMiddleware',  # TransactionMiddleware の前に移動
    'django.middleware.transaction.TransactionMiddleware',
)


イアン ありがとう。ian++

ところで Jogging と django-db-log の比較

Jogging と django-db-log を比較した場合、django-db-log のモデルの方が例外向けに 洗練されてる印象なのですが、例外以外のロギングを考えると、Python の logging を Django 向けにラップしてる Jogging の方が使い易さ的には上かな、と感じました。


そもそも目指してるところが違うっぽいので、単に比較するのもおかしいのかも。


なので、ADMINS にメールで飛んでくるような例外レポートをモデルで管理したければ django-db-log を、例外以外にも Django でも Python コードのようにログを取りたければ Jogging を、という感じ。


別に両方使ってもいいのかもしれないけど。