Tracking/Logging ActiveRecord Callbacks

前端 未结 4 1867
深忆病人
深忆病人 2020-12-18 00:14

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 ca

4条回答
  •  鱼传尺愫
    2020-12-18 00:19

    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
    

提交回复
热议问题