2012-02-21 15 views
11

Ho bisogno di un ID di richiesta univoco per il mio registratore, in modo da poter monitorare ogni richiesta nel file di registro.Come generare un ID di richiesta univoco in Rails?

Finora ho ottenuto questo

REQUEST_ID = Digest::MD5.hexdigest(Time.now.to_f.to_s + $PID.to_s) 

Il problema è che non so dove mettere questo. Ho provato a metterlo nel mio file di logger personalizzato, al di fuori della classe. Ma deve essere memorizzato nella cache o qualcosa del genere perché ottengo sempre lo stesso hash.

Qualche idea?

note. Sto usando Rails 3 e standalone passeggeri

UPDATE:

Rails 3.2: tag uuid non funzionerà. Guarda quanto sono mal formattati i registri:

[0909413851b79676cb06e0842d21c466] [127.0.0.1] 

Started HEAD "/" for 127.0.0.1 at Tue Feb 21 14:08:25 -0300 2012 
[0909413851b79676cb06e0842d21c466] [127.0.0.1] Processing by PagesController#home as HTML 
[0909413851b79676cb06e0842d21c466] [127.0.0.1] bla 
[0909413851b79676cb06e0842d21c466] [127.0.0.1] Rendered pages/home.html.erb within layouts/application (2.0ms) 

Nella produzione questo sarà un disastro. Notare le nuove righe dopo la prima riga? Ora immagina come sarebbero i log in un server che gestisce molte richieste al secondo. Sarà difficile associare una richiesta con un URI

+0

HappyDeveloper, @SergioTulentsev inchiodato! Sto cancellando la mia risposta; per favore accetta il suo –

risposta

4

Se si desidera inserire l'UUID richiesta presso la linea di log Started GET "/" for 127.0.0.1 at Tue Feb 21 14:00:00 -0300 2012, è possibile correggere o sottoclasse Rails::Rack::Logger per modificare il metodo di call_app:

def call_app(env) 
    request = ActionDispatch::Request.new(env) 
    path = request.filtered_path 
    Rails.logger.info "\n\nStarted #{request.request_method} \"#{path}\" for #{request.ip} at #{Time.now.to_default_s}" 
    @app.call(env) 
ensure 
    ActiveSupport::LogSubscriber.flush_all! 
end 

L'oggetto della richiesta è creato subito prima della dichiarazione di registrazione , quindi è possibile modificare la dichiarazione di registrazione per includere request.uuid.

+0

Come di rotaie 3.2 - puoi anche eseguire l'override del metodo 'started_request_message' - https://github.com/rails/rails/commit/35a17502b6054ab6d6407c0af902a441e8ae8215 – robd

+0

Vedi anche http://stackoverflow.com/ domande/7214166/full-urls-in-rails-logs – robd

34

Il team principale di Rails si è preso cura di esso per voi!

Rails 3.2 introduce il metodo request.uuid, che restituisce, um, identificatore di richiesta univoco, che assomiglia a questo: ab939dfca5d57843ea4c695cab6f721d.

Vedere release notes here.

Dai un'occhiata anche a at this awesome screencast per sapere come utilizzare questo nuovo metodo con la registrazione.

# config/environments/development.rb 
config.log_tags = [:uuid, :remote_ip] 


# log file 
[ab939dfca5d57843ea4c695cab6f721d] [127.0.0.1] 

Started GET "/" for 127.0.0.1 at 2012-01-27 21:52:58 +0000 
[ab939dfca5d57843ea4c695cab6f721d] [127.0.0.1] Processing by ProductsController#index as HTML 
[ab939dfca5d57843ea4c695cab6f721d] [127.0.0.1] Product Load (0.3ms) SELECT "products".* FROM "products" 
[ab939dfca5d57843ea4c695cab6f721d] [127.0.0.1] Rendered products/index.html.erb within layouts/application (22.0ms) 
[ab939dfca5d57843ea4c695cab6f721d] [127.0.0.1] Completed 200 OK in 81ms (Views: 73.1ms | ActiveRecord: 0.3ms) 
[98eec5f8976586c1165b981797086b6a] [127.0.0.1] 
+0

Wow, grazie. C'è più documentazione su questo? Quali altri tag posso aggiungere? Inoltre, aggiunge brutti spazi come nei log che hai postato (vedi gli spazi prima di "Rendering"). Sai se posso accedere all'uuid dall'esterno per creare il mio logger? – HappyDeveloper

+0

@HappyDeveloper: si, è un metodo su un oggetto 'request'. Quindi puoi accedervi nei tuoi controller, 'logger.debug request.uuid'. –

+0

Ma ho bisogno di accedere all'ID della richiesta dal mio inizializzatore perché i registri iniziano prima del controller. Destra? Cosa posso fare?Sono ancora bloccato con questo – HappyDeveloper

5

Follow-up della risposta utilizzando log_tags, poiché: uuid è solo univoco tra una richiesta, è difficile utilizzarlo con il rilevamento di sessione.

Ho trovato log_tags accettare un Proc e passare un oggetto di richiesta come parametro. Quindi, codice seguente timbrare tutti voce di registro con session_id (supponendo che si sta usando ActiveRecord negozio di sessione in base)

config.log_tags = [ lambda {|req| "#{req.cookie_jar["_session_id"]}" }, :remote_ip, :uuid ] 
+0

Wow, questo è risolto il mio problema di richiesta ID di heroku, grazie! –