2012-02-21 17 views
11

Necesito una ID de solicitud única para mi registrador, por lo que puedo rastrear cada solicitud en el archivo de registro.¿Cómo generar una ID de solicitud única en Rails?

Hasta ahora tengo este

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

El problema es que no sé dónde poner esto. Intenté colocarlo dentro de mi archivo logger personalizado, fuera de la clase. Pero debe estar en caché o algo así porque siempre obtengo el mismo hash.

¿Alguna idea?

nota. Estoy usando los carriles 3 y autónomo de pasajeros

ACTUALIZACIÓN:

Rails 3.2: Etiqueta UUID no funcionará. Observe qué tan mal formateados están los registros:

[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) 

En producción esto será un desastre. Observe las nuevas líneas después de la primera línea? Ahora imagine cómo se verían los registros en un servidor que maneja muchas solicitudes por segundo. Será difícil asociar una solicitud con un URI

+0

HappyDeveloper, @SergioTulentsev perfeccionado! Estoy borrando mi respuesta; por favor acepta su. –

Respuesta

4

Si desea insertar el UUID petición en la línea de registro Started GET "/" for 127.0.0.1 at Tue Feb 21 14:00:00 -0300 2012, se puede parchear o subclase Rails::Rack::Logger modificar el call_app método:

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 

El objeto de la petición se crea justo antes de la declaración de registro , por lo que puede cambiar la declaración de inicio de sesión para incluir request.uuid.

+0

A partir de los rieles 3.2 - también puede anular el método 'started_request_message' - https://github.com/rails/rails/commit/35a17502b6054ab6d6407c0af902a441e8ae8215 – robd

+0

Vea también http://stackoverflow.com/ preguntas/7214166/full-urls-in-rails-logs – robd

34

¡El equipo central de Rails se encargó de ello!

Rails 3.2 introduce el método request.uuid, que devuelve, um, un identificador de solicitud único, que se ve así: ab939dfca5d57843ea4c695cab6f721d.

Ver release notes here.

También eche un vistazo a at this awesome screencast para saber cómo utilizar este nuevo método con el registro.

# 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 gracias. ¿Hay más documentación sobre esto? ¿Qué otras etiquetas puedo agregar? Además, agrega espacios desagradables como en los registros que publicó (vea los espacios antes de 'Prestados'). ¿Sabes si puedo acceder al uuid desde el exterior para hacer mi propio registrador? – HappyDeveloper

+0

@HappyDeveloper: sí, es un método en un objeto 'request'. Para que pueda acceder a él en sus controladores, 'logger.debug request.uuid'. –

+0

Pero necesito acceder al ID de solicitud desde mi inicializador porque los registros comienzan antes del controlador. ¿Derecha? ¿Que puedo hacer?Todavía estoy atascado con este – HappyDeveloper

5

Seguimiento de la respuesta usando log_tags, ya que: uuid es único entre una solicitud, es difícil de usar con el seguimiento de la sesión.

Encontré que log_tags aceptaba un Proc y pasaba un objeto de solicitud como parámetro. Así que, siguiendo el código sellará todas entrada de registro con session_id (asumiendo que usted está utilizando ActiveRecord de almacenamiento de sesión basado)

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

Guau, eso ha solucionado mi problema de identificación de solicitud heroku, gracias! –

Cuestiones relacionadas