[IMP] tools/misc.py: @logged decorator also log exceptions
authorChristophe Simonis <chs@openerp.com>
Tue, 10 Aug 2010 09:40:06 +0000 (11:40 +0200)
committerChristophe Simonis <chs@openerp.com>
Tue, 10 Aug 2010 09:40:06 +0000 (11:40 +0200)
[ADD] tools/misc.py: @traceback decorator that log the traceback at call

bzr revid: chs@openerp.com-20100810094006-4kkh0tyitzkh3d8j

bin/tools/misc.py

index 3fb2a71..d82f41a 100644 (file)
@@ -899,15 +899,33 @@ def logged(f):
             vector.append('  kwarg %10s: %s' % (key, pformat(value)))
 
         timeb4 = time.time()
-        res = f(*args, **kwargs)
-        
-        vector.append('  result: %s' % pformat(res))
-        vector.append('  time delta: %s' % (time.time() - timeb4))
-        netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, '\n'.join(vector))
+        try:
+            res = f(*args, **kwargs)
+
+            vector.append('  result: %s' % pformat(res))
+        except Exception, e:
+            vector.append('  exception: %s' % pformat(e))
+            raise
+        finally:
+            vector.append('  time delta: %s' % (time.time() - timeb4))
+            netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, '\n'.join(vector))
         return res
 
     return wrapper
 
+
+def traceback(f):
+    from tools.func import wraps
+
+    @wraps(f)
+    def wrapper(*args, **kwargs):
+        import logging
+        from traceback import format_stack
+        logging.getLogger('debug').debug(''.join(format_stack()))
+        return f(*args, **kwargs)
+    return wrapper
+
+
 class profile(object):
     def __init__(self, fname=None):
         self.fname = fname