Django:关闭HTTP响应消息的控制台输出
我们用Django做了一个应用,每次收到请求时,它都会在控制台上打印出很多HTTP响应信息。
[Date String] 'GET /urlpath/..blah blah ' 200 216
[Date String] 'DELETE /anotherurl/..blah blah ' 200 205
...
..
我们已经关闭了所有的日志输出,把Debug设置为False。还试过用'python manage.py runserver --verbosity 0'命令。甚至尝试把sys.stdout改成一个NullDevice()类。但是,我们就是无法关闭这些响应信息,这让服务器变得非常慢。其他的消息都能关闭,唯独这些不行。有没有什么建议?
我知道Django的内置服务器只是为了开发用的,不适合生产环境,但我们希望在开发版本中也能有不错的速度(不想深入了解如何在Apache/lighttpd后面部署Django)。
3 个回答
内置的开发服务器并不是为了性能而设计的,所以建议使用gunicorn
。你可以把它添加到你的Django项目中,这样就能使用一个命令run_gunicorn
,作为runserver
的替代。它比内置的开发服务器快很多,响应也更灵敏。如果你想的话,还可以通过--log-level
来设置gunicorn的日志级别。它也很容易部署,适合用于生产环境。
你可以继续使用控制台日志记录,但通过这个小修改,你可以完全屏蔽掉一些噪音信息,比如
GET /urlpath/..blah blah ' 200 216
...
这些信息的HTTP结果代码都是200,表示请求成功。在你的站点包目录或者虚拟环境(如果你在用的话)里,找到这个文件夹结构:django / core / servers / basehttp.py
然后找到
类WSGIRequestHandler,
函数定义log_message(self, format, *args)
在
# Don't bother logging requests for admin images or the favicon.
if (self.path.startswith(self.admin_media_prefix)
or self.path == '/favicon.ico'):
return
之后插入
# START ----- Don't show page requests which have run successfully
if args[1] == '200':
return
# END ----- Don't show page requests which have run successfully
这是一种针对Python 2.7.3和Django 1.4.3的临时解决办法,我也希望能找到更好的定制方法,嘿!
你只需要在Django的日志设置中添加一些内容:
'loggers': {
# django's default logger
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
}
你可以覆盖Django默认的日志记录器:https://github.com/django/django/blob/32265361279b3316f5bce8efa71f2049409461e3/django/utils/log.py#L18
Django默认的内置日志记录器是怎么工作的:https://docs.djangoproject.com/en/1.10/topics/logging/#id3
使用自定义的CallbackFilter过滤器:https://docs.djangoproject.com/en/1.10/topics/logging/#django.utils.log.CallbackFilter