访问 ActiveSupport::LogSubscriber 子类中的 Rails 请求



我正在尝试制作一个自定义的Rails记录器,它最终将记录到数据库中。 但是,我无法访问我非常希望拥有的请求对象之类的东西。

我目前正在尝试使用LogSubscriber(通知)接口来完成大部分工作;也许这不是正确的方法。 我知道我可以滥用Thread.current[],但我希望避免这样做。

这是我拥有的代码,它与我可以获得的示例一样基本。 这是在初始值设定项中加载的。

module RequestLogging
  class LogSubscriber < ActiveSupport::LogSubscriber
    def process_action(event)
      pp request # <--- does not work
      pp event
    end
end
RequestLogging::LogSubscriber.attach_to :action_controller
您可能需要

覆盖ActionController::Instrumentation中的process_action,然后请求对象将像event.payload[:request]一样可访问。我认为您可以将代码放在config/initializers,代码示例中的某个位置:

ActionController::Instrumentation.class_eval do
  def process_action(*args)
    raw_payload = {
      controller: self.class.name,
      action:     self.action_name,
      params:     request.filtered_parameters,
      format:     request.format.try(:ref),
      method:     request.method,
      path:       (request.fullpath rescue "unknown"),
      request:    request,
      session:    session
    }
    ActiveSupport::Notifications.instrument("start_processing.action_controller", raw_payload.dup)
    ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
      result = super
      payload[:status] = response.status
      append_info_to_payload(payload)
      result
    end
  end
end

你可以得到even.payload,然后传递你自己的CustomLogger(formatted_log(even.payload),然后你可以定义一个模块并保存它。您可能需要自定义formatted_log功能以相应地美化有效负载。

def process_action(event)
  CustomLogger.application(formattedLog(event.payload))
end
def formattedLog(payload)
 # some restructuring of data.
end

最新更新