我正在尝试制作一个自定义的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