Forum: Italian Ruby user group Analizzazione delle query eseguite

Posted by Dboz Dboz (dbozz)
on 2009-07-02 16:55
Tutte le query eseguite dalla applicazione rubyonrail vengono
memorizzate nei rispettivi file log (development, production ..)
E' possibile salvare tali dati su database, o meglio salvare le query
eseguite da ogni azione? Esistono già dei plugin in merito?
Posted by Sandro Paganotti (Guest)
on 2009-07-02 17:31
(Received via mailing list)
mmh.. immagino di si... prova a guardare se esiste gia un
logger che lavora su database..

Alternativamente bisogna cercare chi logga quelle query (dove
soprattutto) ed intercettarlo :D

Sandro

2009/7/2 Dboz Dboz <a.dallabenetta@gmail.com>
Posted by Paolo Montrasio (pmontrasio)
on 2009-07-02 17:40
Dboz Dboz wrote:
> Tutte le query eseguite dalla applicazione rubyonrail vengono
> memorizzate nei rispettivi file log (development, production ..)
> E' possibile salvare tali dati su database, o meglio salvare le query
> eseguite da ogni azione? Esistono già dei plugin in merito?

Googlando si trova qualcuno che ha rediretto tutto il log della sua 
macchina, Rails incluso, verso un db usando syslog-ng. Ci sono dei link 
a 
http://stackoverflow.com/questions/1070613/error-logging-in-rails-using-mysql

Dovresti però cambiare la configurazione (ti interessa solo Rails) e 
dovresti anche trovare il modo di mandare nel db solo le query. A questo 
punto ti consiglierei piuttosto di lasciar stare syslog-ng e mettere 
mano alle classi di logging di Rails. Guarda il codice del metodo

module ActiveSupport
  class BufferedLogger
    def add(severity, message = nil, progname = nil, &block)
      ...
    end
  end
end

nella lib della rispettiva gemma. Dovresti crearti un file nella lib 
della tua applicazione Rails che lo riscrive estraendo le query dal 
message e inviandolec al db. Ovviamente non devi loggare questi accessi 
al db, pena temo un loop infinito, per cui dovrai usare il metodo 
silence del BufferedLogger

http://api.rubyonrails.org/classes/ActiveSupport/BufferedLogger.html#M001816

Secondo me in una mezza giornata te la cavi.

Paolo
Posted by Dboz Dboz (dbozz)
on 2009-07-03 09:34
Grazie!!! Mi metto al lavoro
Saluti
DBOZ
Posted by Pietro Giorgianni (giorgian)
on 2009-07-03 10:49
(Received via mailing list)
2009/7/3 Dboz Dboz <a.dallabenetta@gmail.com>:
> Grazie!!! Mi metto al lavoro

non è che poi pubblichi anche il risultato? potrebbe essere utile a tanti.

pietro
Posted by Dboz Dboz (dbozz)
on 2009-07-03 11:05
A quest link
http://blog.gugl.org/archives/47
spiega molto bene come sovrascrivere il metodo add della classe 
BufferedLogger e come configurarlo nell'enviroment.
Questa è la riga dove di modifica l'output che andrà nel file di log

message = "#{Time.now.to_formatted_s(:db)} #{SEVERITIES[severity]} 
#{message.strip}"  +" the end \n"

L'informazione che a me interessa è il tempo di esecuzione dell'azione 
eseguita dal controller per intercettare qualche anomalia o disfunzione 
nell'applicazione

Ho creato il metodo
def add_visit
    visit = Visit.new
    visit.ip = request.remote_ip
    visit.url = request.request_uri
    visit.user_id = current_user.id

    visit.controller_name = request.path_parameters['controller']
    visit.action_name = request.path_parameters['action']
    visit.domain_name = request.domain
    visit.subdomain_name = request.subdomains
    visit.port_integer = request.port
    visit.port_string = request.port_string
    visit.protocol_name = request.protocol
    visit.execution_time !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    visit.save
  end

nella classe ApplicationController < ActionController::Base che faccio 
eseguire in determinati controller che mi interessa, una sorta di 
contavisite.

Per intenderci l'informazione che a me serve è: Completed in 549ms più 
in particolare 549

 2009-07-03 10:36:32 INFO ==>>Completed in 549ms<== (View: 185, DB: 22) 
| 200 OK [http://localhost/manufacturing/product_composed]
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.