【问题标题】:How to do "Lazy-write" per-request logging in Django?如何在 Django 中按请求进行“懒写”日志记录?
【发布时间】:2011-07-16 21:41:07
【问题描述】:

使用 Django,我需要执行一些涉及数据库写入的每个请求的日志记录。

我了解 Django 的 process_request()process_response() 中间件挂钩,但据我所知,这些挂钩位于呈现网页响应的关键路径(按设计)。

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

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

我目前正在使用 WSGI,但希望尽可能使用最通用的解决方案。

【问题讨论】:

  • 另一种方法是使用 logging.Handler 来缓冲写入。也许给它一个flush(),这样你就可以告诉它何时写入“真正的”处理程序。

标签: django


【解决方案1】:

Django 实现了一个request_finished-signal,它在响应处理完成后触发,但不利的一面是,它不允许您访问当前的request 对象,这使得它不太有用日志记录... 连接到 django 响应处理的最新位置很可能在 HttpResponse class itself 中。你可以例如。将数据暂存于request.session,并以close()方法写入数据库。

但我想您还应该考虑其他替代方案:您可以使用 Celery 之类的东西来异步处理您的日志记录任务。此外,还有像 MongoDB 这样的非 sql 数据库,它们为您提供方便且高性能的日志记录功能,例如。 you dont have to wait until the changes are really committed 到数据库,它可以为您带来很大的性能优势。

【讨论】:

  • 信号实际上是在进程中执行的,但对于 Celery 作为异步解决方案 +1。
  • 嗯,你是对的,在代码库中查找它,在 WSGI 处理程序返回响应之前发送信号,尽管信号的名称可能暗示其他内容。对于所有感兴趣的人:code.djangoproject.com/browser/django/trunk/django/core/…
猜你喜欢
  • 2012-10-08
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2013-04-04
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多