`django.request`记录器没有记录来自视图的4xx和5xx响应

时间:2016-05-30 18:50:13

标签: python django logging

我正在尝试使用django.request记录器记录所有4xx和5xx响应,但这仅在引发异常或urlconf中未匹配URL时才有效。

我的settings.py如下:

import logging.config

LOGGING_CONFIG = None

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
        'logfile': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': "logfile",
            'maxBytes': 50000,
            'backupCount': 2,
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['logfile'],
            'level': 'WARNING',
            'propagate': True,
        }
    },
}
logging.config.dictConfig(LOGGING)

如果我有一个返回4xx或5xx状态的视图:

def test500(request):
    return HttpResponse("error", status=500)

然后没有记录任何内容。但是,如果我的视图引发了这样的异常,则会正确记录异常:

def testcrash(request):
    print 1/0 # server will respond with 500

这是django.request记录器的预期行为吗?记录我的观点返回的5xx和4xx响应的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

我前段时间遇到过这个问题。以下是发生的事情:

  • 500错误仅在未捕获异常的结果时才会被记录。如果手动设置500状态,则不会记录该状态。这是relevant part of the code - 您可以看到该记录发生在handle_uncaught_exception方法中。

  • 404响应的行为目前相同 - 仅记录未捕获的Http404响应。 然而,这在Django 1.10中有所改变。查看我的comment on this ticket

      

    我只想指出,这种改变改变了Django 404记录的行为。

         

    以前,如果Http404异常冒泡到核心处理程序,Django只会记录404(如果视图/中间件捕获异常并返回响应,则不会,而不管该响应是否仍为404 )。

         

    现在,它将记录所有404响应,无论它们是如何生成的。这对我来说似乎更好,但可能有些应用程序依赖于之前的行为。

    因此,从Django 1.10开始,所有404响应都将被记录。这对我来说似乎有点不协调。

  • 仅在引发相应的异常时才会记录其他4xx个响应。 400个例外情况会记录到django.security,而不会记录到django.request.

回答你的另一个问题 - 一直记录这些东西的最佳方法是什么? - 我发现最可靠的方法是编写自己的中间件,检查所有响应的状态并进行自己的记录。

编辑:我created a ticket试图解决Django中的一些不一致问题。该问题已在Django 2.1中修复。

答案 1 :(得分:-1)

如果您只需要查看错误并且使用的是apache2.4服务器,可以在/var/log/apache2/error.log找到它

访问日志可在/var/log/apache2/access.log

找到