2013-01-22 25 views
1

我在寻找,做一般包括以下解决每一个用户动作:Rails的解决方案记录可以查询后

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

我们有多个应用程序共享模式设置(全部击中同一个数据库),所以我们能够记录数据来自哪个应用程序。这是我们想要实现这样的事情的地方,位于我们应用程序常见的中心位置。

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

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

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

如果有意义,我们愿意使用像Redis这样的东西来达到此目的。我与Redis合作的经验极少,不确定Redis是否能够处理这样的事情。

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

+1

这种类型的东西有时也被称为审计线索。你可能想要谷歌这个名字的谷歌。 – Casper

+0

是卡斯帕尔 - 我们使用审计,但我认为那些“审计”宝石一般只记录模型的变化,对吗?将这些事件反向映射到特定的控制器名称/操作并不容易。 –

回答

0

其现实。人们使用Redis来实现一般的缓存目的,因此仅仅记录用户使用情况不应该是一个问题。

使用Redis的对象宝石 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 

编辑:展示如何使用它时,只有用户在登录

+0

这是否也允许我记录用户完成的控制器名称和操作?我不只是想增加和减少控制器操作的使用次数。 –

+1

是的,这就是你所说的redis哈希。所以你会做ControllerActionUserTracking,我有blog_show_user_tracking = Redis :: HashKey.new(“BlogShowUserTracking”)。正如你所看到的博客是控制器,Show是上面的动作。哈希本身存储在一个密钥中,因此您可以使用该密钥来跟踪哪个控制器以及哪个操作。 – rovermicrover

+0

哦,我知道你说什么让我编辑一秒钟。 – rovermicrover