寻找基于nosql(redis/mongodb)的Django事件日志记录

4 投票
3 回答
2402 浏览
提问于 2025-04-15 23:08

我在找一个灵活的事件记录平台,想用来存储一些预定义的事件(比如用户名、IP地址)和一些非预定义的事件(可以由任何代码随时生成),用于Django框架。目前我有些事情是用日志文件来处理的,但这需要各种分析脚本,最后还得存到数据库里,所以我在考虑直接把数据放到像MongoDB或Redis这样的NoSQL数据库里。

我的想法是,能够轻松查询,比如用户最常用哪个IP地址,用户是否曾经执行过某个操作,查看特定事件的结果等等。

有没有现成的工具可以做到这些?

如果没有,我在想这个方案:

这个“事件”是一个附加在请求对象上的字典。中间件会填入各种信息(用户名、IP、SQL执行时间),代码根据需要填入其他信息。

在请求处理完后,一个后处理钩子会把这个事件放入MongoDB或Redis,规范化各种字段(比如增加用户名和IP地址的计数),其他信息则原样放入。

如果有人有好的建议或者相关代码的指引,我会非常感激。

3 个回答

0

这个问题是几年前提出来的。

不过,任何正在寻找相同问题的人可能会从这个回答中得到一些帮助。

简单来说,Django有一个叫做 LogEntry 的模型,可以处理来自管理后台的所有用户日志:

from django.admin.models import LogEntry

举个例子,你可以很简单地使用这个模型,通过django-rest-framework创建一个接口来获取日志数据,只需将这个模型设置为 Meta.model = LogEntry,并在视图集中使用 querysets = LogEntry.objects.all()。

如果你想在Django中连接MongoDB,现在有一个很棒的包叫做 djongo

你可以通过以下命令安装它:

pip install djongo

然后在你的settings.py文件中添加以下代码:

# database setup to connect with mongodb.
DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'NAME': 'demodatabase',
        'CLIENT': {
           'host': 'your-db-host',
        }
    }
}

这里有一个日志的例子:

    {
        "id": 3,
        "action_time": "2021-09-24T17:19:51.252000Z",
        "object_id": "1",
        "object_repr": "Test title",
        "action_flag": 1,
        "change_message": "[{\"added\": {}}]",
        "user": 1,
        "content_type": 7
    },

你还可以添加多个数据库,比如只添加MongoDB来接收日志,这样你只需要创建路由来处理哪个数据库做什么。

你可以查看文档,那里有更详细的解释

1

我不太确定有没有一个库能完全满足你对NoSQL数据库的需求。不过,最近刚发布了一个MongoDB的后端,它似乎可以和Django的ORM(对象关系映射)一起使用,虽然功能上有些限制。

这是链接。

也许你可以把这个和现有的日志系统结合起来,利用Django自带的ORM?希望这能对你有一点帮助。

3

mongodb-log 这个项目可能可以作为你想做的事情的基础。

撰写回答