Мы хотим иметь коллекцию контроллеров, в которых мы отправляем логин, выводимый из всех действий и методов нижестоящих потоков, в отдельный файл журнала. Это проект Rails 3. В Rails 2 мы сделали это, переопределив метод «logger», но в Rails 3 способ записи - «Rails.logger». Я попытался положитьРелейный выход регистратора для определенного контроллера в Rails 3
Rails::logger = Logger.new(File.join(Rails.root, 'log', "reports_controller.log"), 10, 1000000)
в верхней части контроллера, а только конкретные случаи, когда Rails.logger используется именно в действия послана на указанный лог-файл, все выхода журнала по умолчанию для контроллера по-прежнему маршрутизируется в основной файл журнала.
Как мы можем маршрутизировать весь выход журнала для конкретного контроллера в конкретный файл журнала, чтобы включить все выходные данные контроллера по умолчанию?
По выходе контроллера по умолчанию, я имею в виду все сообщения, которые начинаются с самого начала въездного запроса
Started POST "/api/v1/reports.json" for 10.XXX.XX.XX at 2015-03-07 01:30:22 +0000
Processing by Api::V1::ReportsController#create as JSON
Parameters: {"report"=>{"cloud_file_path"=>"report.zip", "company_id"=>nil, "created_at"=>"2015-03-07T01:30:17Z", "type_id"=>"2", "updated_at"=>"2015-03-07T01:30:17Z", "master"=>"1"}}
и все выходные журнала, которые могут вытекать из входящего запроса и ответа исходящего в контроллер и т. д.
В принципе, я хочу, чтобы все отчеты для контроллера отчетов находились в файле reports_controller.log, и я не хочу, чтобы сообщения для трафика отображались в главном журнале (т. е. production.log если в производстве)
Update:
Благодаря @ mudasobwa-х помочь с его ответом и чат, я был в состоянии решить это с помощью промежуточного программного, как его ответ Изображает (хотя я должен был изменить свой insert_before, чтобы быть перед Rails :: Rack :: Logger)
пересмотренный ответ от него, что решил это для меня ниже, и он живет в config/initializers/logger_middleware.rb
module MyApp
class LoggerMiddleware
REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports/.*|
REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log"
def initialize(app)
@app, @logger = app, 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
. Так же этот подход, установив Rails.logger в промежуточном программном обеспечении, оценивая REQUEST_URI, повлиять на все протоколирование с этой точки вперед для этого вызова? Или это еще одно дополнительное место, чтобы поймать больше? Например, после другого ответа я заметил, что мне пришлось перенаправить ActiveRecord :: Base.logger отдельно, если я хотел, чтобы протоколы db также маршрутизировались. Переустанавливает ли промежуточное программное обеспечение стойки и устанавливает логгер для этого и других мест, где также определен логгер, или мне нужно будет улучшить это, чтобы включить в это время большее количество регистраторов (или дальше вверх по течению?). – Streamline
Установка 'Rails :: logger.instance_variable_get (: @ logger) .instance_variable_get (: @ log)' влияет на все (я использую это в процессе производства.) Установка только 'Rails :: logger' зависит от того, что я не глубоко вникнул (вкратце: я предлагаю установить базовый 'Logger'.) – mudasobwa
Когда вы говорите, что теперь устанавливаются Rails :: logger.instance_variable_get (: @ logger) .instance_variable_get (: @ log), вы делаете это в том же как вы разместили через промежуточное программное обеспечение и просто заменили эту строку 'когда% r | \ A/api/v1/| то Rails :: logger = @ my_logger' выше с этим 'when% r | \ A/api/v1/| затем Rails :: logger.instance_variable_get (: @ logger) .instance_variable_set (: @ log, @ my_logger) '? – Streamline