Skip to content

Instantly share code, notes, and snippets.

@nhance
Created September 6, 2012 12:58
Show Gist options
  • Star 35 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save nhance/3655996 to your computer and use it in GitHub Desktop.
Save nhance/3655996 to your computer and use it in GitHub Desktop.
Rails compatible method logging. Use this to log all calls to instance methods of a class to the log.
Model.new.foo
module MethodLogger
def self.included(base)
methods = base.instance_methods(false) + base.private_instance_methods(false)
base.class_eval do
methods.each do |method_name|
original_method = instance_method(method_name)
define_method(method_name) do |*args, &block|
Rails.logger.info "-> #{base}##{method_name}(#{args.inspect})"
return_value = original_method.bind(self).call(*args, &block)
Rails.logger.info "<- #{base}##{method_name} #=> #{return_value.inspect}"
return_value
end
end
end
end
end
class Model
include MethodLogging
def foo
"bar"
end
end
-> foo([])
<- foo #=> "bar"
@ethier
Copy link

ethier commented Nov 5, 2013

Very handy. Thanks for sharing. include MethodLogging needs to be include MethodLogger though.

@kke
Copy link

kke commented Jun 3, 2014

Doesn't self.included only know about the methods above it? Wouldn't it have to be included at the bottom of model.rb for it to see foo?

@ridiculous
Copy link

Could also checkout https://github.com/ridiculous/object_tracker for tracking all methods with execution time

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment