Rails日志中的完整URL

是否可以在Rails应用程序的日志中获取完整的URL? 目前我得到的东西是这样的:

在2011-08-27 13:13:10 +0200开始获取127.0.0.1的“/”

但我需要得到:

在2011-08-27 13:13:10 +0200开始GET“http:// localhost:3000 /”for 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返回Started GET "/session/new" for 127.0.0.1 at 2012-09-26 14:51:42 -0700Started GET "/session/new" for 127.0.0.1 at 2012-09-26 14:51:42 -0700 ,而不是使用猴子修补before_dispatch或call_app Started GET "/session/new" for 127.0.0.1 at 2012-09-26 14:51:42 -0700位。

因此,您可以在您自己的记录器或猴子补丁中覆盖该方法。

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

这条线来自中间件Rails::Rack::Logger ,它位于铁路中。 最简单的方法是,您可以覆盖执行日志记录的方法,例如,在初始化程序中:

 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 ,然后通过以下方式从堆栈中删除Rails::Rack::Logger

 config.middleware.insert_before(Rails::Rack::Logger, YourLogger) config.middleware.delete(Rails::Rack::Logger) 

如果你走这条路线你可能会检查机架记录器使用ActionDispatch::Request ,并确保在发送后通过ActiveSupport::LogSubscriber.flush_all!完成另一项冲洗日志用户缓存的ActiveSupport::LogSubscriber.flush_all!

我不认为你可以在不改变Rails本身的情况下做到这一点,这不是很好,但你可以添加自己的日志调用:

 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" 

所以我得到:

在2011-08-27 15:33:40 +0200开始获取127.0.0.1的“/ users / login”

在2011-08-27 15:33:40 +0200开始GET“http:// localhost:3000 / users / login”为127.0.0.1

 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