2010-04-19 11 views
13

J'essaie d'obtenir plus d'informations dans mes journaux Rails, en particulier l'URI demandé ou les paramètres actuels, si disponible (et j'apprécie qu'ils ne le seront pas toujours). Cependant, je ne semble pas capable de le faire. Voici ce que je l'ai fait jusqu'à présent:Inclure les paramètres/demande d'informations dans 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 

semblent donc je peux personnaliser le message bien, mais je ne pas être en mesure d'accéder aux params/variables de demande ici. Est-ce que quelqu'un sait si c'est possible, et si oui, comment? Ou s'il y a une meilleure façon d'obtenir cette information? (Peut-être même quelque chose Redis basé?)

charges Merci,

Dan

Répondre

0

vous devriez regarder dans la classe de demande

comme met request.uri.

ici pour vérifier plus en détail http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html

+0

Merci VP, mais cela ne semble pas fonctionner. Je crois, parce que le Logger est configuré avant que la plupart des Rails ne soient chargés, il n'a pas accès à la variable @env, ni même aux variables params/request. @env est nul dans la portée du format_message, tout comme request, et request_uri donc aussi des erreurs. –

3

Cela devrait fonctionner! :) à votre santé.

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

logger.info(params.inspect)

par le par .. Cela devrait être placé dans votre action contrôleurs. Ex: Si vous le placez dans votre créer action il devrait également enregistrer le user_agent dans le navigateur, remote_ip i.e l'adresse IP à distance de l'utilisateur et tous les paramètres.

+0

Salut Paddy, merci pour cela. Alors que cela fonctionnerait, existe-t-il un moyen d'avoir automatiquement la requête/params disponible pour l'enregistreur lui-même? C'est à dire. si, plutôt que d'appeler logger.info/warn/error à partir du contrôleur, il a été appelé à partir d'une exception levée n'importe où dans le code. Par exemple. Je peux avoir dans le code un appel capricieux à current_user.profesion.blank? Ce serait une erreur car profesion devrait être profession (fonction indéfinie sur néant etc). Ce serait génial dans le journal d'avoir les paramètres url/current ainsi que la trace de la pile. –

+0

J'ai essayé ça. Mais comme vous l'avez dit, Logger est configuré avant le chargement de Rails.J'ai trouvé cet article que je ne sais pas vraiment comment il pourrait être utile: http://www.ubuntusolutions.org/2009/08/custom-logger-in-rails.html –

+0

Yea. L'inverse pourrait être d'étendre en quelque sorte la classe/le code qui appelle le Raise/logger en premier lieu, pour ajouter des données supplémentaires dans le msg? Même juste le ActionController quelque part? –

25

(réponse longtemps après cela a été demandé, mais peut-être cela aidera la personne à côté.)

Je viens de faire quelque chose de similaire. 1) vous devez remplacer votre enregistreur séparément des détails de levée de demande de journalisation. On dirait que vous avez pensé personnaliser votre enregistreur. La réponse est ici: Rails logger format string configuration

2) Je consigne la demande et la réponse de toutes les demandes dans mon service. Notez, que Rails met une tonne de substance dans les en-têtes, donc juste le dumping de la demande ou les en-têtes est probablement une mauvaise idée. De plus, mon application est principalement accessible via une API. Si le vôtre est principalement une application web, comme je pense que la plupart des gens sont, vous ne voulez probablement pas inspecter la réponse car elle contiendra votre code 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

C'est exactement ce que je cherchais. J'ai bien travaillé. Je vous remercie. – Howler

+0

Cette réponse est incroyable! Merci –

+2

En fait, cela n'a fonctionné que pour moi quand j'ai changé de request.headers à request.headers.env. (J'utilise Rails 4). Fait modifier la suggestion. – Medeiros