Django - 记录每个视图的操作

Posted

技术标签:

【中文标题】Django - 记录每个视图的操作【英文标题】:Django - logging each view's action 【发布时间】:2013-09-14 13:31:28 【问题描述】:

我正在考虑为我的 django Web 应用程序创建一个日志系统。 Web 应用程序的使用非常全面(涵盖业务流程的所有方面),因此我想跟踪发生的每个事件。具体来说,我想记录运行的每个视图,而不仅仅是“主要”视图,并且可能记录视图执行时发生的事情。

当我处于日志记录系统的“构思”阶段时,我很快就遇到了一些让我不确定如何进行的问题。以下是我的主要问题:

我正在考虑将所有事件记录在主 Web 应用程序保存其数据的同一个 mysql 数据库中。我担心的是将 MySQL 数据库膨胀成一个庞大的数据库。此外,如果数据库崩溃或以某种方式被破坏(是的,我有备份),我也会丢失我的日志,这会破坏任何追踪问题的能力。我是使用单独的数据库还是只使用文本文件? 我的粒度如何?最初,我想简单地记录诸如“日期 - 在我的视图中”之类的内容。但是,正如我正在考虑的那样,最好记录视图中发生的所有内容。这样做可能会使日志大量! 而且还会使我的代码变得丑陋,因为代码中混入了如此多的日志条目行。这种细节: 日期 - 进入视图 myView 日期 - 在视图 myView 中,从 DB 中检索到对象 myObject 日期 - 在视图 myView 中,将 myObject 字段 myField 设置为 myNewValue 日期 - 离开 myView

这些是我目前的主要想法。在这方面有什么建议吗?

谢谢

【问题讨论】:

你可以查看这个项目:eventlog 【参考方案1】:

我认为最好和正确的方法是创建您自己的自定义中间件,您可以在其中记录您需要的所有内容。

以下是有关该主题的一些链接:

中间件sn-ps http://djangosnippets.org/snippets/2624/ http://djangosnippets.org/snippets/290/ http://djangosnippets.org/snippets/264/ django-logging-middleware(相当老的可能会给你一个想法) django-request django.db.backends日志记录 Is there a Django middleware/plugin that logs all my requests in a organized fashion? Django verbose request logging log all sql queries django orm, how to view (or log) the executed query?

另外,考虑使用sentry 错误记录和聚合平台,而不是将日志写入数据库。仅供参考,请参阅using a database for logging。

【讨论】:

【参考方案2】:

如果您想记录在每个视图中运行的任何操作,例如,您可以将entered view Aexited view A 替换为以下语句中的一行:view A - 147ms。 正如 alecxe 所说,您可以记录请求/SQL,使用中间件有很多方法可以做到这一点。关于数据库(对象)操作,您可以将单个 saves、updates 和 deletes 与信号联系起来。 对于批量 updates 和 deletes,您可以(这不是一种干净的方法,但它会起作用)monkey-patch manager 和 queryset 方法来添加日志记录。 这样您就可以记录操作而不是 SQL。 我会看到这样的行:

[2013/09/11 15:11:12.0153] view   app.module.view       200  148ms
[2013/09/11 15:11:12.0189] orm    save:auth.User,id=1        3ms

这是一个快速而肮脏的提议,但也许值得。

【讨论】:

以上是关于Django - 记录每个视图的操作的主要内容,如果未能解决你的问题,请参考以下文章

当表单操作设置为“。”时,Django 重定向到不同的视图。

使用django开发博客过程记录5——日期归档和视图重写

Django开发笔记

18-Django REST framework-使用Django开发REST 接口

django 日志记录为每个请求全局设置上下文?

如何记录每个请求的 Django 应用程序的内存使用情况