2010-04-19 13 views
13

Estoy tratando de obtener más información en mis registros de Rails, específicamente el URI solicitado o los parámetros actuales, si están disponibles (y agradezco que no siempre serán). Sin embargo, parece que no puedo. Esto es lo que he hecho hasta ahora:¿Incluir información de params/solicitud en Rails logger?

#config/environments/production.rb 
config.logger = Logger.new(config.log_path) 
config.log_level = :error 
config.logger.level = Logger::ERROR 

#config/environment.rb 
class Logger 
    def format_message(level, time, progname, msg) 
    "**********************************************************************\n#{level} #{time.to_s(:db)} -- #{msg}\n" 
    end 
end 

, así que puede personalizar el mensaje de bien, sin embargo, no parecen ser capaces de acceder a las variables params/Solicitar aquí. ¿Alguien sabe si esto es posible y, de ser así, cómo? O si hay una mejor manera de obtener esta información? (Tal vez incluso algo basa Redis?)

cargas, gracias,

Dan

Respuesta

0

usted debe buscar en la clase de petición

como pone request.uri.

cheque aquí para más detalle http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html

+0

Gracias VP, pero parece que no funciona. Creo que, dado que el registrador está configurado antes de que se cargue la mayoría de los rieles, no tiene acceso a la variable @env, ni tampoco a las variables params/request. @env es nulo dentro del alcance del mensaje de formato, como es solicitud, y request_uri también errores. –

3

Esto debería funcionar! :) aplausos.

logger.info({:user_agent => request.user_agent, :remote_ip => request.remote_ip}.inspect)

logger.info(params.inspect)

Por cierto .. Esto se debe colocar en su acción controladores. Ejemplo: si lo coloca en su crear acción, también debe registrar el user_agent, es decir, el navegador, remote_ip, es decir, la IP remota del usuario y todos los parámetros.

+0

Hola Paddy, gracias por esto. Si bien esto funcionaría, ¿hay alguna forma de tener automáticamente la solicitud/parámetros disponibles para el registrador? Es decir. si, en lugar de llamar a logger.info/warn/error desde el controlador, se ha invocado a partir de una excepción que se ha generado en cualquier parte del código. P.ej. Puedo tener en el código una llamada caprichosa a current_user.profesion.blank? Esto sería un error ya que profesion debería ser una profesión (función indefinida en nil, etc.). Sería genial en el registro tener los parámetros url/current así como el seguimiento de la pila. –

+0

Lo intenté. Pero como dijiste, Logger está configurado antes de que se cargue Rails.Encontré este artículo que realmente no sé lo útil que podría ser: http://www.ubuntusolutions.org/2009/08/custom-logger-in-rails.html –

+0

Sí. A la inversa, ¿podría extenderse de algún modo la clase/código que llama a Raise/logger en primer lugar, para agregar datos adicionales al mensaje? ¿Incluso el ActionController en alguna parte? –

25

(Respondiendo mucho tiempo después de esto se le pidió, pero tal vez ayudará a la persona siguiente.)

que acabo de hacer algo similar.

1) necesita anular su registrador por separado de los detalles de solicitud de registro. Parece que has pensado en personalizar tu registrador. La respuesta está aquí: Rails logger format string configuration

2) Logo la solicitud y la respuesta de todas las solicitudes en mi servicio. Tenga en cuenta que Rails pone una tonelada de cosas en los encabezados, por lo que simplemente eliminar la solicitud o los encabezados probablemente sea una mala idea. También cabe destacar que mi aplicación se accede principalmente a través de una API. Si el suyo es principalmente una aplicación web, como supongo que es de la mayoría de la gente, probablemente no desee inspeccionar el cuerpo de response.body ya que contendrá su html.

class ApplicationController < ActionController::Base 
    around_filter :global_request_logging 
... 
    def global_request_logging 
    http_request_header_keys = request.headers.keys.select{|header_name| header_name.match("^HTTP.*")} 
    http_request_headers = request.headers.select{|header_name, header_value| http_request_header_keys.index(header_name)} 
    logger.info "Received #{request.method.inspect} to #{request.url.inspect} from #{request.remote_ip.inspect}. Processing with headers #{http_request_headers.inspect} and params #{params.inspect}" 
    begin 
     yield 
    ensure 
     logger.info "Responding with #{response.status.inspect} => #{response.body.inspect}" 
    end 
    end 
end 
+1

Esto es exactamente lo que estaba buscando. Funcionó muy bien. Gracias. – Howler

+0

¡Esta respuesta es asombrosa! Gracias –

+2

En realidad, solo funcionó para mí cuando cambié de 'request.headers' a' request.headers.env'. (Estoy usando Rails 4). Hecho sugerencia de edición. – Medeiros

Cuestiones relacionadas