2010-04-19 85 views
13

我想獲得更多的信息到我的Rails日誌中,特別是請求的URI或當前參數(如果可用的話(我明白它們並不總是這樣)。但我似乎不能。這是我到目前爲止已經完成:在Rails記錄器中包含參數/請求信息?

#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 

所以我可以自定義消息罰款,但我似乎並沒有能夠在這裏訪問PARAMS /請求變量。有誰知道這是否可能,如果有的話,怎麼樣?或者如果有更好的方式來獲取這些信息? (也許甚至一些Redis的基礎?)

感謝負載,

回答

0

,你應該看看在請求類

像放request.uri。

點擊此處瞭解詳情http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html

+0

感謝副總裁,但它似乎並不奏效。我相信,因爲Logger是在大多數Rails被加載之前配置的,所以它不能訪問@env變量或者params/request變量。 @env在format_message的範圍內是零,請求也是如此,因此request_uri也是錯誤。 – 2010-04-19 14:08:06

3

這應該工作! :)歡呼聲。

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

logger.info(params.inspect)

順便提一下..這應該被放置在你的控制器動作。例如:如果您將它放在您的創建操作中,它還應該記錄user_agent,即瀏覽器,remote_ip即用戶的遠程IP和所有參數。

+0

嗨帕迪,謝謝你。雖然這會起作用,但有沒有辦法自動將請求/參數提供給記錄器本身?即如果不是從控制器調用logger.info/warn/error,而是從代碼中任何地方引發的異常調用它。例如。我可能會在代碼中調用current_user.profesion.blank嗎?這將是錯誤的,因爲profesion應該是職業(未定義的函數,無等)。具有url/current params以及堆棧跟蹤的日誌會很棒。 – 2010-04-19 16:03:14

+0

我試過了。但正如你所說的,Logger是在Rails加載之前配置的。我發現這篇文章,我真的不知道它有多大的幫助:http://www.ubuntusolutions.org/2009/08/custom-logger-in-rails.html – 2010-04-19 16:40:22

+0

是的。另一種方式可能是以某種方式擴展調用Raise/logger的類/代碼,以便向msg中添加一些額外的數據?即使只是ActionController的地方? – 2010-04-19 17:00:54

25

(響應後,這個被問了半天,但也許這將有助於在未來的人。)

我只是做了類似的事情。

1)您需要重寫您的記錄器與記錄請求等級細節分開。看起來你已經想出了定製你的記錄器。答案在這裏: Rails logger format string configuration

2)我將所有請求的請求和響應記錄到我的服務中。請注意,Rails會在頭文件中放入大量的東西,所以直接轉儲請求或頭文件可能是一個壞主意。另外值得注意的是,我的應用程序主要通過API訪問。如果你的主要是一個網絡應用程序,正如我猜測大多數人是的,你可能不想檢查response.body,因爲它會包含你的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

這正是我所期待的。工作很好。謝謝。 – Howler 2011-09-01 19:39:00

+0

這個反應太棒了!謝謝 – 2012-11-14 19:17:55

+2

實際上,它只在從request.headers改變爲request.headers.env時適用於我。 (我正在使用Rails 4)。編輯建議。 – Medeiros 2014-08-07 18:51:14

相關問題