跟踪/记录 ActiveRecord 回调 [英] Tracking/Logging ActiveRecord Callbacks
本文介绍了跟踪/记录 ActiveRecord 回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有没有办法在每次发生 ActiveRecord 回调时自动记录?当记录有多个回调时,这将有助于追溯为什么会发生某些事情.
Is there any way to automatically log everytime an ActiveRecord callback happens? It would help to trace through why certain things are happened when a record has several callbacks in place.
我想看到自动日志消息,指示正在调用哪些消息以响应哪些回调,例如:before_validation:调用 update_capitalization
I'd like to see automated log message that indicate which messages are being called in response to which callbacks, e.g.: before_validation: calling update_capitalization
推荐答案
对于 google 和后代(在 Rails 3 上):
For google and posterity (on Rails 3):
module CallbackTrace
def self.included kls
kls.send :alias_method_chain, :_compile_filter, :trace
end
def _compile_filter_with_trace filter
generated_code = _compile_filter_without_trace(filter)
return generated_code if filter.is_a?(Array)
method_name = generated_code.to_s.split(%r{\(|\s}).first
_klass = @klass
prelogger = ->{
Rails.logger.info("START [#{filter.class}](#{generated_code})")
Rails.logger.info("#{_klass} #{Time.now}")
if imethod=(_klass.instance_method(method_name) rescue nil)
begin
Rails.logger.info(imethod.source)
rescue MethodSource::SourceNotFoundError
Rails.logger.info("NO SOURCE FOR #{generated_code}")
end
else
Rails.logger.info("NO METHOD: #{method_name} for #{@klass}")
end
}
postlogger = ->{
Rails.logger.info("ENDED #{generated_code} #{Time.now}")
}
@klass.send :define_method, "prelogger_#{method_name}", &prelogger
@klass.send :define_method, "postlogger_#{method_name}", &postlogger
"(prelogger_#{method_name}; retval = retval = #{generated_code}; " +
"postlogger_#{method_name}; retval)"
end
end
ActiveSupport::Callbacks::Callback.send :include, CallbackTrace
这篇关于跟踪/记录 ActiveRecord 回调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文