nei*_*llb 8 ruby logging ruby-on-rails ruby-on-rails-3
语境:
在rails 3项目中,我想(大量)自定义ActionController中"Processing"和"Completed in"日志行的格式和内容.这是为了让它们与旧版rails 2.3应用程序的(也是自定义)格式相匹配,允许重复使用各种分析工具.使它们成为固定字段(通过在必要时使用占位符)也可以更容易地使用(例如)awk对它们进行即席查询,或者在没有智能解析的情况下将它们加载到db或splunk中.
我通过分叉导轨和修补有问题的LogSubscriber 快速而严谨地实现了这个目标,但我现在正在寻找正确的方法.
这是我想我想做的事情:
LogSubscriber继承ActionController::LogSubscriber.start_processing和process_action方法.ActionController::LogSubscriber,一旦加载了类,就会(遗憾地)注册自己. 这是我坚持的步骤.:action_controller使用我的自定义订阅者attach_to.我注意到,如果默认ActionController的日志订阅者的连接是作为配置步骤而不是类加载完成的,事情会更容易.
题:
假设上面概述的方法是合适的,我如何取消订阅或取消附加默认日志订阅者ActionController::LogSubscriber?基类ActiveSupport :: LogSubscriber提供了attach_to但没有分离的方法.
或者,在上面提到的类ActionController :: LogSubscriber中,改变(或完全抑制)两个方法(start_processing,process_action)的行为的最简洁方法是什么.
当然,我也欢迎任何其他(可维护的)方法,它可以完全自由地定制所提到的两行的日志格式.
不合适的方法:
参考文献:
我已经制定了以下解决方案。
我对它的某些方面不是特别满意(例如,必须取消订阅“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
Run Code Online (Sandbox Code Playgroud)
关于中止初始进场的注释:
我最初尝试了一种取消注册默认 LogSubscriber 的方法,目的是让我们的自定义 LogSubscriber 继承并完成所有工作(无需重新实现)。
然而,也存在一些问题。
1)仅删除 LogSubscriber 还不够,如下所示:
ActiveSupport::LogSubscriber.log_subscribers.delete_if{ |ls|
ls.instance_of? ActionController::LogSubscriber }
Run Code Online (Sandbox Code Playgroud)
由于通知请求仍处于注册状态。
2)此外,当您继承 LogSubscriber 并注册它时,似乎不会使用继承的实现来调用任何非重写方法。
| 归档时间: |
|
| 查看次数: |
2854 次 |
| 最近记录: |