0

我有一个内置Django+的 Web 应用程序,Python它与 Web 服务(用JAVA编写)交互。

现在所有的数据库管理部分都由 Web 服务完成,即对实际数据库的所有CRUD操作都由 Web 服务完成。


现在我必须在一些日志表中跟踪在我的网站上完成的所有用户活动。

就像如果用户发布了一篇新文章,那么Web 服务会在文章表中创建一个新行并并排,我需要在日志表中添加一个新行,例如“用户:拉曼发布了一篇新文章(与ID、头衔等)

我必须对数据库中的所有对象执行此操作,例如“文章”、“媒体”、“评论”等


注意:我正在使用 PostgreSQL


那么实现这一目标的最佳方法是什么..?(我应该在PostgreSQL还是 JAVA中执行..??..And How..??)

4

5 回答 5

1

所以你有了UI <-> Web Services <-> DB

由于Web 服务与数据库通信,并且 Web 服务包含业务逻辑(即,我猜您在那里验证内容、创建查询并执行它们),因此“记录”活动的最佳位置是在服务本身中。

IMO,记录PostgreSQL事务是另一回事。它不再与记录“用户活动”相同。

编辑:这仍然意味着您为“日志”创建数据库模式并将它们写入数据库。

第二次编辑:在UI中捕获有价值的事件,然后从那里记录它们可能也不是最好的主意。如果您决定替换 UI,或者例如为移动设备或其他东西编写替代 UI,则必须重写日志记录。

于 2012-03-30T12:21:23.450 回答
1

对于数据库本身的审计表,请查看PL/pgSQL 触发器审计示例

这会将每个 INSERT、UPDATE、DELETE 记录到另一个表中。

于 2012-03-30T14:24:44.187 回答
0

在您的日志表中,您可以有各种列,包括:

  • user_id(执行该操作的用户)
  • activity_type(活动的类型,例如viewcommented_on
  • object_id(它所涉及的实际对象,例如文章或媒体)
  • object_type(对象的类型;这可以在以后使用,结合object_id在数据库中查找对象)

这样,您可以跟踪用户执行的所有操作。每当您希望跟踪的事情发生时,您都需要更新此表。

于 2012-03-30T11:47:40.510 回答
0

每当我们不得不这样做时,我们都会为每个模型和可能的动作覆盖信号。

https://docs.djangoproject.com/en/dev/topics/signals/

你可以让信号做任何你想做的事情,从将一些 HTML 注入页面,到在数据库中创建一个条目。它们是学习使用的绝佳工具。

于 2012-03-30T12:23:07.210 回答
0

我使用了 django-audit-log,我很满意。

Django-audit-log 可以在它自己的附加表中跟踪多个模型。所有这些表都非常统一,因此创建一个显示所有模型数据的 SQL 视图应该相当简单。

这是我为跟踪单个模型(“Pauza”)所做的工作:

class Pauza(models.Model):
    started      = models.TimeField(null=True, blank=False)
    ended        = models.TimeField(null=True, blank=True)
    #... more fields ...

    audit_log = AuditLog() 

如果您希望在 Django Admin 中显示更改,您可以创建一个非托管模型(但这绝不是必需的):

class PauzaAction(models.Model):

    started      = models.TimeField(null=True, blank=True)
    ended        = models.TimeField(null=True, blank=True)
    #... more fields ...

    # fields added by Audit Trail:
    action_id    = models.PositiveIntegerField(primary_key=True, default=1, blank=True)
    action_user  = models.ForeignKey(User, null=True, blank=True)
    action_date  = models.DateTimeField(null=True, blank=True)
    action_type  = models.CharField(max_length=31, choices=(('I', 'create'), ('U', 'update'), ('D', 'delete'),), null=True, blank=True)
    pauza        = models.ForeignKey(Pauza, db_column='id', on_delete=models.DO_NOTHING, default=0, null=True, blank=True)

    class Meta:
        db_table = 'testapp_pauzaauditlogentry'
        managed = False
        app_label = 'testapp'

testapp_pauzaauditlogentry是由 django-audit-log 自动创建的,这只是创建了一个模型来显示其中的数据。加入一些粗鲁的篡改保护可能是个好主意:

class PauzaAction(models.Model):

    # ... all like above, plus:

    def save(self, *args, **kwargs):
        raise Exception('Permission Denied')
    def delete(self, *args, **kwargs):
        raise Exception('Permission Denied')

正如我所说,我想您可以创建一个包含四个action_字段和一个附加的“action_model”字段的 SQL 视图,该字段可以包含对模型本身的 varchar 引用(可能只是原始表名)。

于 2012-03-30T17:49:05.330 回答