Полные URL в журналах Rails - PullRequest
       10

Полные URL в журналах Rails

4 голосов
/ 27 августа 2011

Можно ли получить полные URL-адреса в журналах приложения Rails? В настоящее время я получаю что-то вроде:

Запущен GET "/" для 127.0.0.1 2011-08-27 13:13:10 + 0200

но мне нужно получить:

Запущен GET "http://localhost:3000/" для 127.0.0.1 в 2011-08-27 13:13:10 + 0200

потому что это приложение, в котором важны домены.

Ответы [ 5 ]

6 голосов
/ 27 августа 2011

Линия идет от промежуточного программного обеспечения 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!

3 голосов
/ 27 августа 2011

Я не думаю, что вы можете сделать это без изменения самого Rails, что нехорошо, но вы можете добавить свой собственный вызов журнала:

class ApplicationController < ActionController::Base

  before_filter :log_request

  protected

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

end
2 голосов
/ 06 марта 2013

Начиная с Rails 3.2.12, вместо monkey-patching 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)
2 голосов
/ 27 августа 2011

Обходной путь, который я сейчас использую, создавал этот класс:

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"

так я получаю:

Запущен GET "/ users / login" для 127.0.0.1 в 2011-08-27 15:33:40 + 0200

Запущен GET "http://localhost:3000/users/login" для 127.0.0.1 в 2011-08-27 15:33:40 + 0200

1 голос
/ 12 июня 2013
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
...