Перенаправить вывод логгера для конкретного контроллера в 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 для этого вопроса.