0

Django+でWebサービスを構築するWebアプリケーションを持っています( JAVAPythonで書かれています)。

現在、すべてのデータベース管理部分は Web サービスによって行われます。つまり、実際のデータベースに対するすべてのCRUD操作は Web サービスによって行われます。


ここで、Web サイトで行われたすべてのユーザー アクティビティをいくつかのログ テーブルで追跡する必要があります。

ユーザーが新しい記事を投稿した場合のように、新しい行が Web サービスによって Articles テーブルに作成され、並んで、新しい行をログ テーブルに追加する必要があります。 ID、タイトル等)

「記事」、「メディア」、「コメント」など、データベース内のすべてのオブジェクトに対してこれを行う必要があります


注:PostgreSQLを使用しています


それで、これを達成するための最良の方法は何ですか..?? ( PostgreSQLまたはJavaで実行する必要があります..??..そしてどのように..??)

4

5 に答える 5

1

DB 自体の監査テーブルについては、PL/pgSQL トリガー監査の例を参照してください。

これにより、すべての INSERT、UPDATE、DELETE が別のテーブルに記録されます。

于 2012-03-30T14:24:44.187 に答える
1

だから、あなたは持っていますUI <-> Web Services <-> DB

Web サービスは DB と通信し、Web サービスにはビジネス ロジックが含まれているため (つまり、そこで検証し、クエリを作成して実行すると思います)、アクティビティを「ログ」するのに最適な場所はサービス自体です。

IMO、PostgreSQLトランザクションのログ記録は別のものです。これは、「ユーザー アクティビティ」のログ記録とは異なります。

編集:これは、「ログ」の DB スキーマを作成し、それらを DB に書き込むことを意味します。

2 番目の編集: UIでログに値するイベントをキャッチし、そこからそれらをログに記録することも、最善のアイデアではない可能性があります。UI を置き換えることを決定した場合、またはたとえば、モバイル デバイスなどの代替 UI を作成する場合は、ログを書き直す必要があります。

于 2012-03-30T12:21:23.450 に答える
0

ログ テーブルには、次のようなさまざまな列を含めることができます。

  • user_id(アクションを実行したユーザー)
  • activity_type( や などの活動のview種類commented_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_先ほど言ったように、4 つのフィールドと、モデル自体への varchar 参照 (おそらく元のテーブル名) を含むことができる追加の「action_model」フィールドを持つ SQL ビューを作成できると思います。

于 2012-03-30T17:49:05.330 に答える