是否可以在Rails應用程序的日誌中獲取完整的URL?目前,我得到這樣的:Rails日誌中的完整URL
開始在2011-08-27 13點13分10秒+0200
GET 「/」 爲127.0.0.1,但我需要得到:
入門掌握的 「http://本地主機:3000 /」 在2011-08-27 13時13分10秒+0200
,因爲這是一個應用程序,其中域是重要127.0.0.1。
是否可以在Rails應用程序的日誌中獲取完整的URL?目前,我得到這樣的:Rails日誌中的完整URL
開始在2011-08-27 13點13分10秒+0200
GET 「/」 爲127.0.0.1,但我需要得到:
入門掌握的 「http://本地主機:3000 /」 在2011-08-27 13時13分10秒+0200
,因爲這是一個應用程序,其中域是重要127.0.0.1。
從Rails 3.2.12開始,現在有一種方法可以接收請求並返回Started GET "/session/new" for 127.0.0.1 at 2012-09-26 14:51:42 -0700
位,而不是monkey_patch_break_atch或call_app。
所以你可以在你自己的記錄器或猴子補丁中重寫該方法。
# or "class Rails::Rack::Logger < ActiveSupport::LogSubscriber" for monkey patch
class URLLogger < Rails::Rack::Logger
def started_request_message(request)
'Started %s "%s%s%s" for %s at %s' % [
request.request_method,
request.protocol,
request.host_with_port,
request.filtered_path,
request.ip,
Time.now.to_default_s ]
end
end
如果子不要忘了修改config/application.rb
中間件鏈(並確保URLLogger配置塊裝入前):
config.middleware.insert_before(Rails::Rack::Logger, URLLogger)
config.middleware.delete(Rails::Rack::Logger)
我不認爲你可以做到這一點沒有變化的鋼軌本身,這是不是很好,但您可以添加自己的日誌電話:
class ApplicationController < ActionController::Base
before_filter :log_request
protected
def log_request
logger.info("Started #{request.method} #{request.url}")
end
end
現在,我使用的解決方法,是創造這個類:
class HostnameLogger
def initialize(app)
@app = app
end
def call(env)
uri = env["REQUEST_URI"]
if uri.blank? # While testing a Rails app, there's no env["REQUEST_UIR"] defined.
uri = "http://#{env["HTTP_HOST"]}#{env["PATH_INFO"]}"
end
Rails.logger.info "Started #{env["REQUEST_METHOD"]} \"#{uri}\" for #{env["REMOTE_ADDR"]} at #{Time.now}"
@app.call(env)
end
end
,然後將其添加爲Rack中間件(在application.rb中):
config.middleware.use "HostnameLogger"
所以我GE T:
入門使用 「/用戶/登錄」 爲127.0.0.1於2011-08-27 15時33分四十秒+0200
入門掌握的「http://本地主機:3000 /用戶/登錄「爲127.0.0.1在2011-08-27 15:33:40 +0200
該行來自中間件Rails::Rack::Logger
,這是railties。在最簡單的,你可以只覆蓋的方法做記錄,例如,在初始化:
class Rails::Rack::Logger < ActiveSupport::LogSubscriber
protected
def before_dispatch(env)
request = ActionDispatch::Request.new(env)
info "\n\nStarted #{request.request_method} \"#{request.url}\" for #{request.ip} at #{Time.now.to_default_s}"
end
end
如果你不想重寫記錄器,你總是可以添加你自己的,你已經創建,然後從堆棧通過刪除Rails::Rack::Logger
:
config.middleware.insert_before(Rails::Rack::Logger, YourLogger)
config.middleware.delete(Rails::Rack::Logger)
如果你走這條路線,你可以檢查出的機架記錄儀的ActionDispatch::Request
其使用,並且一定要做到這一點確實刷新日誌用戶緩存的其他工作在發貨後,通過ActiveSupport::LogSubscriber.flush_all!
非常豐富,非常感謝。 – Pablo
我將這個片段應用到了我的rails項目中,它在我的開發環境中運行良好,但在生產環境中卻不行。仍然不知道爲什麼 – Frankel
只是猜測,但是你的生產日誌級別高於'info'?值得注意的是,這個答案不再是最新的。機架記錄儀從那以後改變了。 – numbers1311407
Rails::Rack::Logger.class_eval do
protected
def started_request_message(request)
"Started #{request.request_method} \"#{request.url}\" for #{request.ip} at #{Time.now.to_default_s}"
end
end
唯一的缺點我看到這個解決方案是自定義日誌行不在主要日誌行旁邊,它不會記錄圖像,JavaScript等。我不確定後者是否會在稍後的項目中出現問題,因爲它更復雜。 – Pablo