`django.request`记录器未记录视图中的4xx和5xx响应



我正试图用django.request记录器记录所有4xx和5xx响应,但只有当出现异常或URL在urlconf.中不匹配时,这才有效。

我的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回复的最佳方式是什么?

我自己不久前也遇到过这个问题。情况如下:

只有当500错误是未捕获异常的结果时,才会记录这些错误。如果手动设置500状态,则不会记录该状态。这是代码的相关部分——正如您所看到的,这段日志记录发生在handle_uncaught_exception方法内部。
  • 404响应的行为目前是相同的——只记录未捕获的Http404响应然而,Django 1.10中的情况发生了变化。查看我对这张票的评论:

    我只想注意到,这个变化在一定程度上改变了Django 404日志的行为。

    以前,Django只会在Http404异常出现到核心处理程序时记录404(而不是在视图/中间件捕捉到异常并返回响应时,无论该响应是否仍然是404)。

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

    因此,从Django 1.10开始,所有404响应都将被记录下来。我觉得这有点前后矛盾。

  • 只有在引发相应的异常时,才会记录其他4xx响应。400异常记录到django.security,而不是django.request.

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

    编辑:我创建了一个票证,试图解决Django中的一些不一致问题。这个问题在Django 2.1中得到了修复。

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

    访问日志可以在/var/log/apache2/access.log 中找到

    最新更新