Redirigir la salida del registrador para un controlador específico en Rails 4

He creado una solución basada en la respuesta de mi pregunta anterior.Redirigir la salida del registrador para un controlador específico en Rails 3 para Rails 3. Funciona muy bien, sin embargo, ahora estoy tratando de aplicar la misma solución basada en middleware a un proyecto de Rails 4, pero hay algunas diferencias que impiden que la misma solución funcione.

La solución 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

en lo anterior:

Carriles 3adquiridor para Rails.logger =Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)

Carriles 3setter para Rails.logger (configuración en @my_logger) =Rails::logger.instance_variable_get(:@logger).instance_variable_set(:@log,@my_logger)

Una cosa que noté de inmediato es que en Rails 4 lo anteriorRails::logger.instance_variable_get(:@logger).instance_variable_get(:@log) devuelve nulo

Comprobando en la consola de Rails 4, veo queRails.instance_variable_get(:@logger) devoluciones#<ActiveSupport::Logger:0x007f84ff503a08 ....>

He intentado reemplazar eladquiridor conRails.instance_variable_get(:@logger) y la acomodadora conRails.instance_variable_set(:@logger,my_logger) y casi parece funcionar La primera parte de la actividad, el "Iniciado ..." va al nuevo archivo de registro, pero todo lo que sigue va al archivo de registro predeterminado (el Rails.logger antes de que el middleware lo cambiara).

Ya seaRails.instance_variable_get(:@logger) no es el nivel más bajo equivalente en Rails 4 a Rails 3Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log) paraconseguir / configurar el Rails.logger o hay algo más adelante en el proceso después de mi middleware que está sobrescribiendo esto después de configurarlo.

¿Alguna pista?

Actualizar:

Para aclarar, la solución publicada anteriormente funciona como se esperaba en Rails 3. Cualquier limitación que pueda tener o no en entornos especiales (como si la solución puede no funcionar en entornos de servidores de subprocesos si ese es el caso) está bien en este momento y no experimentado como obstáculos en este momento, por lo tanto, estas mismas limitaciones también están bien en una solución Rails 4 para esta pregunta.

Respuestas a la pregunta(3)

Su respuesta a la pregunta