Rails解决方案,记录以后可以查询的每个用户操作

时间:2013-01-22 02:02:24

标签: ruby-on-rails ruby logging redis

我正在寻找能够解决以下问题的解决方案:

  • 记录每个用户操作。如果可能,以控制器名称,操作和参数的形式
  • 此外,仅记录实际更改为模型对象的内容。例如,控制器可能会获得很长的参数列表,但实际上只有两个参数保存到模型对象中 - 我想知道哪些属性已更改。
  • 可以查询此数据 - 例如,在CRM应用程序中查找用户操作的历史记录

我们为多个应用程序(所有命中同一个数据库)设置了共享模型,因此我们能够记录数据来自哪个应用程序。这就是我们想要在我们的应用程序通用的中心位置实现这样的东西。

这样做的原因是因为我们在事后做了很多取证 - 我们被要求检查谁将某些内容更改为记录,因此我们经常需要转到生产日志并在那里搜索该信息。如果可能的话,我们希望能够使用标准SQL来查询它。

这样做的另一个原因是因为不同的开发人员拥有不同的应用程序,有时某些应用程序的行为不应该如此。如果我能够查找哪个应用程序将特定值保存到模型对象中,那会有所帮助。

关于我们将要查看的控制器名称/操作没有任何模式 - 我们在某些模型上添加了审核逻辑,但随后我们会被要求检查一些我们没有的模型设立审计。

如果有意义,我们愿意为此目的使用像Redis这样的东西。我在使用Redis方面经验很少,并且不确定Redis是否能够处理这样的事情。

这是一个现实的期望 - 能够记录每个用户操作吗?我估计,从各种应用程序中,我们每小时可能总共有300到500个用户操作。或者我是否应该停止探索这种可能性,并在框外思考,而不是如何跟踪用户的行为?

1 个答案:

答案 0 :(得分:0)

它的现实。人们使用Redis进行一般缓存,因此只是跟踪用户使用情况应该不是问题。

使用redis对象gem https://github.com/nateware/redis-objects

对于每个操作,创建一个redis哈希。

每个哈希都包含每个用户的密钥(他们的ID可以使用)。每个密钥都会导致该用户执行操作的次数。

在进行计数时,你甚至可以使用incr方法获得额外的速度。

此外,如果您需要格外小心,可以将其设置为在X增量后,您可以将信息保存回用户行的数据库中。这当然会耗尽一些资源,但如果它值得你,那值得你。

编辑: 我想我应该提供一个示例控制器

class BlogController < OneForMyBabyController

   def show
     #Your Code Here
     #---------------
     if logged_in
       #When you create a new Redis::HashKey its first look to redis
       #if the object already exists it just gets it, other wise it
       #'creates it'*.
       blog_show_user_tracking = Redis::HashKey.new("BlogShowUserTracking")
       blog_show_user_tracking.incr(@user.id)
       #This is about how would deal with updating after a number of incr
       #This would require a separate look up from the incr above.
       #x here is the number of incr before you update the SQL DB
       if blog_show_user_tracking[@user.id] % x == 0
          #Update User To Reflect New Tracking
       end
     end
   end

end

编辑:显示仅在用户登录时如何使用它。