我正试图用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 中找到