我想在我的应用程序中保留每个数据库更改事件的日志。像时间戳+用户名+哪个模型被更改,写入日志文件(只记录模型实例被修改,而不是更改是什么)。信号和日志记录的结合似乎很自然。
所以在模型的信号中我会这样做:
import logging
...
logger = logging.getLogger(__name__)
logger.info("Order {} deleted by {}".format(order.barcode, request.user.email))
Run Code Online (Sandbox Code Playgroud)
这样做的问题是日志的信息级别充满了 POST 和 GET 请求。通常的建议是,如果您不希望日志文件中的所有请求日志都进入更高级别(例如“警告”),但在此处将这些事件标记为警告是没有意义的。另一种选择是使用过滤器来删除 GET/POST 日志,如此处推荐的。但默认情况下,警告和错误级别日志事件也会出现在信息日志中,在这种情况下这也不是所需的行为,因此这些事件也必须被过滤掉。该日志文件实际上只是用于记录“此用户更改了此模型实例”事件。
另外,理想情况下,员工级用户可以在现场访问该文件(只读),因此我正在考虑将此文件放在 MEDIA 目录中。如果日志还包含错误跟踪,那可能是一个坏主意。
这看起来像是一个黑客解决方案,我在这里忽略了什么?
也许更好的方法是使用Django Admin Logs+信号。例如:
from django.contrib.admin.models import LogEntry
LogEntry.objects.log_action(
user_id = ...,
content_type_id = ...,
object_id = ...,
object_repr = ....,
change_message = ...,
action_flag = ...
)
Run Code Online (Sandbox Code Playgroud)
您可以查看此SO 答案以获取更多详细信息。此外,您还可以向管理站点的用户授予权限,告知他们可以看到哪些日志。