Rails日志中的完整URL

时间:2011-08-27 11:14:16

标签: ruby-on-rails ruby logging dns hostname

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

  

在2011-08-27 13:13:10 +0200

开始获取127.0.0.1的“/”

但我需要得到:

  

在2011-08-27 13:13:10 +0200

开始获取“http:// localhost:3000 /”for 127.0.0.1

因为这是一个域很重要的应用程序。

5 个答案:

答案 0 :(得分:6)

这条线来自中间件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

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

如果您走这条路线,您可以查看机架记录器使用ActionDispatch::Request的情况,并确保通过ActiveSupport::LogSubscriber.flush_all!执行其他工作,以便在发送后刷新日志用户缓存。

答案 1 :(得分:3)

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

class ApplicationController < ActionController::Base

  before_filter :log_request

  protected

  def log_request
    logger.info("Started #{request.method} #{request.url}")
  end    

end

答案 2 :(得分:2)

我现在正在使用的解决方法是创建此类:

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

开始获取127.0.0.1的“http:// localhost:3000 / users / login”

答案 3 :(得分:2)

从Rails 3.2.12开始,不是猴子修补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)

答案 4 :(得分: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