Перенаправить вывод логгера для конкретного контроллера в Rails 4

Я построил решение на основе ответа в моем предыдущем вопросеПеренаправить вывод логгера для конкретного контроллера в Rails 3 для Rails 3. Это прекрасно работает, однако сейчас я пытаюсь применить то же промежуточное решение для проекта на Rails 4, но есть некоторые отличия, мешающие тому же решению работать.

Решение Rails 3:

module MyApp
  class LoggerMiddleware

    REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports.*|
    REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log"

    def initialize(app)
      @app = app
      @logger = Rails::logger
           .instance_variable_get(:@logger)
           .instance_variable_get(:@log)
      @reports_api_controller_logger = Logger.new(
           Rails.root.join('log', REPORTS_API_CONTROLLER_LOGFILE), 
           10, 1000000)
    end

    def call(env)
      Rails::logger
           .instance_variable_get(:@logger)
           .instance_variable_set(:@log,
               case env['PATH_INFO']
               when REPORTS_API_CONTROLLER_PATH then
                 @reports_api_controller_logger
               else
                 @logger
               end
           )
      @app.call(env)
    end
  end
end

Rails.application.middleware.insert_before Rails::Rack::Logger, MyApp::LoggerMiddleware

в приведенном выше:

Рельсы 3добытчик для Rails.logger =Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)

Рельсы 3сеттер для Rails.logger (значение @my_logger) =Rails::logger.instance_variable_get(:@logger).instance_variable_set(:@log,@my_logger)

Я сразу заметил, что в Rails 4 вышеRails::logger.instance_variable_get(:@logger).instance_variable_get(:@log) возвращает ноль

Проверяя в консоли Rails 4, я вижу, чтоRails.instance_variable_get(:@logger) возвращается#<ActiveSupport::Logger:0x007f84ff503a08 ....>

Я пытался заменитьдобытчик сRails.instance_variable_get(:@logger) и сеттер сRails.instance_variable_set(:@logger,my_logger) и это почти похоже на работу. Первая часть действия, «Started ...», переходит к новому файлу журнала, но все после этого идет в файл журнала по умолчанию (Rails.logger до того, как промежуточное ПО изменило его).

ИлиRails.instance_variable_get(:@logger) не является эквивалентом нижнего уровня в Rails 4 для Rails 3Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log) заполучение / установка Rails.logger или есть что-то еще позже в процессе после моего промежуточного программного обеспечения, которое перезаписывает это после того, как я его установил.

Есть какие-нибудь подсказки?

Обновить:

Для пояснения, решение, опубликованное выше, работает, как и ожидалось, в Rails 3. Любые ограничения, которые оно может иметь или не иметь в особых средах (например, если решение может не работать в многопоточных серверных средах, если это так), на данный момент приемлемы, и в настоящее время это не препятствие, поэтому эти же ограничения также подходят в решении Rails 4 для этого вопроса.

Ответы на вопрос(3)

Ваш ответ на вопрос