2016-05-30 75 views
2

我试图用django.request记录器记录所有4xx和5xx响应,但是这只有在引发异常或URL中的URL不匹配。`django.request`记录器没有记录来自视图的4xx和5xx响应

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响应的最佳方式是什么?

回答

3

前段时间我自己遇到了这个问题。这是发生了什么:如果是未捕获的异常的结果

  • 500错误仅记录。如果您手动设置500状态,则不会被记录。这里是relevant part of the code--正如你所看到的那样,日志记录发生在handle_uncaught_exception方法中。

  • 404响应的行为当前是相同的 - 只有未被捕获的Http404响应被记录。 但是,这在Django 1.10中已经改变。看我的comment on this ticket

    我只是想指出,这个改变已经改变了Django的404日志记录的行为有点。

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

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

    所以从Django 1.10开始,所有的404响应都会被记录下来。这对我来说似乎有点不一致。

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

为了回答您的其他问题 - 什么是不断记录这些东西的最佳方式? - 我发现的最可靠的方法是编写自己的中间件,它检查所有响应的状态并进行自己的日志记录。

编辑:我created a ticket试图解决Django中的这些不一致之处。

-1

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

访问日志,可以发现在/ var/log/apache2/access.log