Django详细请求日志记录

12

这个问题和这个差不多,但是我希望django将其详细的请求信息记录到我的logging.FileHandler中,而不是只能查看web服务器日志。我尝试过设置默认记录器django.requests,但无法记录4xx和5xx以外的请求信息。

因此,在查阅文档并尝试记录器和级别后,我得出的结论是django实际上没有很多的日志记录声明,因此我想确认一下django是否在内部记录非错误情况的请求。

1个回答

17

我不能说我做了彻底的搜索,但从我所看到的django 1.4.1的 django/core/handlers/base.py 中可以看出,django.request 记录器确实仅用于警告和错误条件(4xx/5xx)。

话虽如此,编写中间件以进行各种日志记录非常简单。以下是一个非常简单的示例:

from time import time
from logging import getLogger

class LoggingMiddleware(object):
    def __init__(self):
        # arguably poor taste to use django's logger
        self.logger = getLogger('django.request')

    def process_request(self, request):
        request.timer = time()
        return None

    def process_response(self, request, response):
        self.logger.info(
            '[%s] %s (%.1fs)',
            response.status_code,
            request.get_full_path(),
            time() - request.timer
        )
        return response

我不确定你是否会得到其他的东西 - 我的回答还提到我不认为 Django 能够成功地进行请求日志记录... - Yaniv Aknin
1
你应该如何将它集成到settings.py中? - Giampaolo Rodolà
2
@GiampaoloRodolà将它添加到MIDDLEWARE_CLASSES中,即MIDDLEWARE_CLASSES += ('myapp.middleware.LoggingMiddleware',),其中上面的类在文件myapp/middleware.py中。 - Rebs
@RexSalisbury 这适用于Django 1.4,你提到它已经过时并参考了Django 1.1?该链接指向此答案...有很多混淆。 - markdsievers
如果由于缓存等原因未触发process_request,则request.timer可能不存在。我的解决方案是将该行更改为:time() - request.timer if hasattr(request, 'timer') else 0 - Colin Basnett
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接