如何在Django中使用“Lazy-write”每个请求日志记录?

问题描述:

使用Django,我需要做一些涉及数据库写入的每个请求日志记录。如何在Django中使用“Lazy-write”每个请求日志记录?

我明白Django的process_request()process_response()中间件挂钩,但据我所知,这些挂钩处于呈现网页响应的关键路径(通过设计)。

我不希望我的请求后数据库写入操作保持页面的响应时间。

Django有一个简单的设计模式,可以让我做一个“懒惰的日志写入”,我可以在请求处理期间使用请求钩子来收集信息,但是任何后续操作和实际的日志写入操作都不会直到响应写入用户之后才会发生?

我目前正在使用WSGI,但宁愿使用最通用的解决方案。

+0

一种替代方法是使用缓冲写入的logging.Handler。也许给它一个flush(),以便你可以告诉它什么时候写入“真实”处理程序。 – 2011-03-16 22:37:10

+0

另请参见http://*.com/q/4313508/621690 – Risadinha 2017-05-08 19:00:21

Django的实现request_finished - 信号响应的处理已经完成之后被解雇,但不好的一面是,它不会允许你访问当前request对象这使得它不太对记录有用的.. 。最近挂入django的响应处理的地方很可能在HttpResponse class itself。你可以例如。将数据临时存储在request.session中,并将它们写入数据库的close()方法中。

但我想还有其他的选择你应该考虑:你可以使用类似Celery异步处理你的日志记录任务。此外,还有非sql数据库,例如MongoDB,可为您提供便捷和高性能的日志记录功能,例如。 you dont have to wait until the changes are really committed到数据库可以给你一个很大的性能优势。

+1

信号实际上是在进程内执行的,但对于Celery而言,它是一个异步解决方案。 – 2011-03-16 21:29:25

+0

那么你是对的,在代码库中查看它,在WSGI处理程序返回响应之前发送信号,尽管信号的名称可能会提示其他信息。感兴趣的人:http://code.djangoproject.com/browser/django/trunk/django/core/handlers/wsgi.py#L275 – 2011-03-16 21:44:30