首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跟踪/记录ActiveRecord回调

跟踪/记录ActiveRecord回调
EN

Stack Overflow用户
提问于 2012-10-26 23:31:16
回答 4查看 3K关注 0票数 10

有没有办法在每次发生ActiveRecord回调时自动记录?当一条记录有多个回调时,追踪为什么会发生某些事情将会很有帮助。

我希望看到自动日志消息,指出哪些消息正在被调用以响应哪些回调,例如:before_validation: calling update_capitalization

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-16 12:46:50

对于google和后代(在Rails 3上):

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2016-06-25 06:59:26

我刚刚为这个写了一个宝石。

代码语言:javascript
复制
# Gemfile
gem "rails-callback_log", group: [:development, :test]

票数 8
EN

Stack Overflow用户

发布于 2012-10-27 00:26:05

更简单的方法是使用rails本地记录器方法:

Debugging Rails Applications

像这样使用它:

代码语言:javascript
复制
logger.debug "Person attributes hash: #{@person.attributes.inspect}"
logger.info "Processing the request..."
logger.fatal "Terminating application, raised unrecoverable error!!!"

编辑:

检查异常发生时调用的内容也很有趣

代码语言:javascript
复制
logger.error("trace: #{ex.backtrace().join("\n")}")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13089936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档