Rails User Action Logger

Hi!

The problem: I need to log my user’s actions on the site ( a game) so I can Datamine it later, It is also very desirable to investigate each user individually.

My solution: (still primitive) A ruby lib that is able to accumulate some actions (in a array) and then append it to a log  File. Aafter_filterapplication_controller that auto-logs every action taken. The action can set a custom warn level, and a custom message.

I made a GIST with this. link1 link2

Usage: The usage is actually automatic, but you can custom with 2 options on a Action, Example:

def create
    @user_session = UserSession.new(params[:user_session])
    
    @bf_errors = 10
    @bf_minutes = 10
    #logger.info ">>>> #{@bfw.to_s}, #{session['create_number']}"
    
    if @bfw = brute_force_warning
      captcha = verify_recaptcha(:model => @user_session, :message => "Favor digite as letras que aparecem distorcidas")
      if (@bfw == :active && !captcha)
        @warn = 8
        @action_obs = "#{@bf_errors} per #{ @bf_minutes} minutes. Email:#{@user_session.try( :email)}, pass: #{@user_session.try( :password)}. "
        render :action => "login"
        return true
      end
    end

Discussion: I chose JSON for being very extremely easy to parse on JavaScript, which has great Libs for data visualization.
I considered the rails Buffered Logger, Beanstalk and direct File Write, but I believe the method I’m using is way faster than those. My assumption is because all I do is native to Ruby, with minimal memory use, and disc access.

TODO:
. A plugin that handles this.
. A controller-action-view to visualize this Data =)

Logando melhor sua aplicação

Estou fazendo um site-game social, com a expectativa de muitos acessos. Pela própria natureza da aplicação e para ter um feedback legal do que é feito no game, eu gostaria de logar todas ações de meus usuários.

Minha aplicação se dará integralmente por AJAX, nesse caso, o Analytics não vai extrair muitos dados, como por exemplo quais páginas são mais acessadas, pelo simples fato que não tem mais de uma página, sobrando para mim o papel de analisar as informações 🙂

Meu primeiro pensamento foi usar o SQL, e armazenar no próprio servidor em tabelas separadas hacks/warns/ações-in-game. Porêm quando se pensa em mais de 1.000 usuários online isso pode se tornar um problema grande devido ao grande número de writes.

Então o ideal seria usar um NoSQL, mas isso envolveria aprender outra arquitetura, me preocupar com outra aplicação rodando no servidor e ainda dado o prazo curto não parece ser a melhor idéia.

A arquitetura pretendida no momento está em criar uma classe filha de ActiveSupport::BufferedLogger http://blog.gugl.org/archives/47 porém que não deve substituir em primeiro momento o logger, mas sim, ter métodos úteis para minha aplicação. Os estilos de mensagem devem seguir o padrão JSON.

Em um próximo post devo publicar meu código.