在rails中记录用户事件

时间:2011-08-29 20:47:46

标签: ruby-on-rails database activerecord logging action

我目前正在尝试为rails应用程序的管理部分实现日志。这将允许管理员查看用户执行了什么操作以及何时执行。例如,'用户添加了一个新地址','用户将他们的邮政编码从X更新为Y'。

由于每个动作都可能涉及许多模型,而不仅仅是用户,因此我创建了一个日志模型,其中包含所有其他系统模型ID,消息和日志代码的字段。

class CreateLogs < ActiveRecord::Migration
  def self.up
    create_table :logs do |t|
      t.integer :user_id
      t.integer :marker_id
      t.integer :administrator_id
      t.integer :group_id
      t.integer :assignment_id
      t.integer :submission_id
      t.integer :code
      t.text :message

      t.timestamps
    end
  end

  def self.down
    drop_table :logs
  end
end

我担心的是,例如,用户可以(比如说)在他们的帐户中添加一个作业,它会被记录为

Log.create(:user_id => current_user.id, :assignment_id => the_assignment.id, :code => 342, :message => '')

(某处代码342对应于'用户创建了一个新地址',因此不需要消息)

显然,在日志视图中,我可以从日志ID /详细信息中提取相关用户和地址信息,但是如果要删除此用户或地址,则所有这些信息都将不可用,因此回顾日志,进入基本没用。

必须有更好的方法或其他东西来帮助记录这样的系统事件并应对潜在的删除。

或者我可以将整个条目存储为文本消息,但这不是很糟糕并且不必要地填满数据库吗?

如果其中任何一项不清楚,请告诉我,只是想到日志记录应用程序操作/事件必须在之前完成!

谢谢,

皮特

2 个答案:

答案 0 :(得分:3)

看看ActiveRecord Versioning上列出的宝石,它可能就是你需要的。

答案 1 :(得分:1)

我认为您使用原始文本代替(或除了)ID之外,找到了一个很好的解决方案。如果您要存储用户名和地址,则可能不会破坏任何存储容量。这几乎就是日志文件的作用;它吐出了谁做了什么,何时发生了什么。我认为它根本不会妨碍你的数据库在文本中存储一些额外的数据。但是,如果确实变得很大,那么你可以随时保持最近几周的时间。值得的日志。也许有某种工作可以清除任何超过4周的日志文件。但这主要取决于您正在进行的日志记录级别:如果您记录用户执行的每个操作,那么这就非常重要。如果您只对关键事件(用户登录/注销,创建/更新/删除某些内容等)感兴趣,那么我认为您可以很好地存储文本并清理每一次而