Я разработал следующее решение.
Я не особенно доволен его аспектами (например, необходимостью отписаться от ВСЕХ интересов в 'process_action.action_controller'), и я непременно примулучший ответ.
Мы добавили следующее как config/initializers/custom_ac_log_subscriber.rb
module MyApp
class CustomAcLogSubscriber < ActiveSupport::LogSubscriber
INTERNAL_PARAMS = ActionController::LogSubscriber::INTERNAL_PARAMS
#Do your custom stuff here. (The following is much simplified).
def start_processing(event)
payload = event.payload
params = payload[:params].except(*INTERNAL_PARAMS)
info "Processing #{payload[:controller]}##{payload[:action]} (...)"
info " Parameters: #{params.inspect}" unless params.empty?
end
def process_action(event)
payload = event.payload
message = "Completed in %.0fms [#{payload[:path]}]" % event.duration
info(message)
end
def logger
ActionController::Base.logger
end
end
end
#Prevent ActionController::LogSubscriber from also acting on these notifications
#Note that the following undesireably unregisters *everyone's*
#interest in these. We can't target one LogSubscriber, it seems(?)
%w(process_action start_processing).each do |evt|
ActiveSupport::Notifications.unsubscribe "#{evt}.action_controller"
end
#Register our own interest
MyApp::CustomAcLogSubscriber.attach_to :action_controller
Примечания по прерванному начальному подходу:
Сначала я попытался подойтиотменить регистрацию LogSubscriber по умолчанию с намерением, чтобы наш пользовательский наследовал и выполнял всю работу (без переопределения).
Однако существует ряд проблем.
1)Недостаточно удалить LogSubscriber следующим образом:
ActiveSupport::LogSubscriber.log_subscribers.delete_if{ |ls|
ls.instance_of? ActionController::LogSubscriber }
Поскольку запрос уведомлений остается зарегистрированным.
2) Кроме того, когда вы наследуете LogSubscriber и регистрируете его, он появляется непереопределенные методы не будут вызываться с использованием унаследованной реализации.