我在Django
+ Python
中构建了一个与Web服务交互的Web应用程序(用 JAVA 编写)。
现在所有 数据库管理 部分都是由网络服务完成的,即所有 CRUD 操作到实际数据库都是由网络服务完成的。
现在我必须在某个日志表中跟踪我的网站上的所有用户活动。
如果用户发布了一篇新文章,那么Web服务会将文章表创建一个新行,并且我需要在日志表中添加一个新行< / strong>,类似于“用户:拉曼发布了一篇新文章(带有ID,标题等)”
我必须为我的数据库中的所有对象执行此操作,如“文章”,“媒体”,“评论”等
注意:我正在使用PostgreSQL
那么实现这个目标的最佳方式是什么? (我应该在 PostgreSQL 或 JAVA .. ?? ..以及如何...... ??)
答案 0 :(得分:1)
所以,你有UI <-> Web Services <-> DB
由于 Web服务与数据库通信,并且Web服务包含业务逻辑(即我猜你在那里验证了什么,创建查询并执行它们),那么最好的地方是' log'活动就在服务中。
IMO,记录 PostgreSQL 交易是另一回事。这与记录“用户活动”不再相同。
编辑:这仍然意味着您为“日志”创建数据库架构并将其写入数据库。
第二次编辑:在用户界面中捕获有关日志的事件,然后从那里记录它们可能也不是最好的主意。如果您决定更换UI,或者例如为移动设备或其他内容编写备用UI,则必须重写日志记录。
答案 1 :(得分:1)
对于DB本身的审计表,请查看PL/pgSQL Trigger Audit Example
这会将每个INSERT,UPDATE,DELETE记录到另一个表中。
答案 2 :(得分:0)
在您的日志表中,您可以拥有各种列,包括:
user_id
(执行操作的用户)activity_type
(活动类型,例如view
或commented_on
)object_id
(它关注的实际对象,例如文章或媒体)object_type
(对象的类型;稍后可以使用它与object_id
结合使用来查找数据库中的对象)这样,您可以跟踪用户执行的所有操作。每当您想要跟踪的事情发生时,您都需要更新此表。
答案 3 :(得分:0)
每当我们必须这样做时,我们就会为每个模型和可能的行动覆盖信号。
https://docs.djangoproject.com/en/dev/topics/signals/
您可以让信号做任何您想做的事情,从将一些HTML注入页面,到在数据库中创建一个条目。它们是学习使用的绝佳工具。
答案 4 :(得分:-1)
我使用了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中显示更改,可以创建unmanaged model(但这绝不是必需的):
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_
字段创建一个SQL视图,另外一个'action_model'字段可以包含对模型本身的varchar引用(可能只是原始表名)。