1

我正在寻找一种通常执行以下操作的解决方案:

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

我们为多个应用程序(都访问同一个数据库)设置了一个共享模型,因此我们能够记录数据来自哪个应用程序。这就是我们希望在我们的应用程序通用的中心位置实现类似的东西的地方。

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

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

对于我们要查看的控制器名称/操作没有任何模式 - 我们在某些模型上添加了审计逻辑,但随后我们会被要求检查我们尚未设置审计的不同模型的某些内容为了。

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

这是一个现实的期望 - 能够记录每个用户操作吗?我粗略估计我们每小时可能有来自各种应用程序的 300 到 500 个用户操作。或者我应该停止探索这种可能性,而是跳出框框思考我应该如何跟踪用户的一般行为?

4

1 回答 1

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

编辑:显示只有用户登录时如何使用它。

于 2013-01-22T02:25:51.677 回答