djangoのログ機能を使って、呼び出されたview名とかパラメーターとかを書き出してたんだけど、viewでキャッシュを使うとログを書いてくれなくなるので、それをなんとかしたいという話。

コードにするとこんな感じ

#views.py
...
from django.views.decorators.cache import cache_page
import logging
logger = logging.getLogger("hoge")

@cache_page(60*60*24*30)
def index(request, param1, param2):
    logger.info(u"param1:{0} param2:{1}".format(param1, param2))
    ...

こうするとキャッシュが効いてしまって、1回アクセスした時以外ログが出なくなってしまう。アクセスログ的 な使い方をしたい時に困ってしまう。アクセスログはnginxとかそこらへんのログに任せてた方が良いような気もするが、 django内で何とかしたかったのでrequest_startedシグナルを使って下のようにした

#views.py
from 
import logging
logger = logging.getLogger("hoge")

@cache_page(60*60*24*30)
def index(request, param1, param2):
    logger.info(u"param1:{0} param2:{1}".format(param1, param2))
    ...
#ここから追記
from django.core.signals import request_started
import copy
from django.core.handlers.wsgi import WSGIRequest
from django.core.urlresolvers import resolve
def log_before_view(**kwargs):
    try:
        handler = kwargs["sender"]
        environ = copy.copy(kwargs["environ"])
        request = WSGIRequest(environ)
        match = resolve(request.path_info)
        if len(match.args) == 2:
            logger.info(u"param1:{0} param2:{1}".format(param1, param2))
    except:
        pass
request_started.connect(log_before_view)

これでキャッシュが効いてる状態でもログを取ることが出来る