Question or problem about Python programming:
I’m implementing a RESTful web service in python and would like to add some QOS logging functionality by intercepting function calls and logging their execution time and so on.
Basically i thought of a class from which all other services can inherit, that automatically overrides the default method implementations and wraps them in a logger function. What’s the best way to achieve this?
How to solve the problem:
Solution 1:
Something like this? This implictly adds a decorator to your method (you can also make an explicit decorator based on this if you prefer that):
class Foo(object): def __getattribute__(self,name): attr = object.__getattribute__(self, name) if hasattr(attr, '__call__'): def newfunc(*args, **kwargs): print('before calling %s' %attr.__name__) result = attr(*args, **kwargs) print('done calling %s' %attr.__name__) return result return newfunc else: return attr
when you now try something like:
class Bar(Foo): def myFunc(self, data): print("myFunc: %s"% data) bar = Bar() bar.myFunc(5)
You’ll get:
before calling myFunc myFunc: 5 done calling myFunc
Solution 2:
What if you write a decorator on each functions ? Here is an example on python’s wiki.
Do you use any web framework for doing your webservice ? Or are you doing everything by hand ?