From 233d4b42681187f0a1a75e481a738ac528269d83 Mon Sep 17 00:00:00 2001 From: Goffi Date: Mon, 5 May 2014 18:58:34 +0200 Subject: [PATCH] =?UTF-8?q?core=20(log):=20added=20magic=20%(profile)s=20k?= =?UTF-8?q?ey=20to=20log=5Ffmt:=20=20=20=20=20if=20%(profile)s=20is=20used?= =?UTF-8?q?=20in=20log=5Ffmt,=20S=C3=A0T=20try=20to=20find=20profile=20val?= =?UTF-8?q?ue=20using=20introspection.=20This=20is=20for=20debugging=20pur?= =?UTF-8?q?pose=20only,=20*DO=20NOT*=20use=20in=20production.=20This=20key?= =?UTF-8?q?=20don't=20work=20(yet=20=3F)=20with=20standard=20backend,=20an?= =?UTF-8?q?d=20will=20not=20work=20in=20every=20frontend.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/log.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/core/log.py b/src/core/log.py index a25e0686..f1ff98b2 100644 --- a/src/core/log.py +++ b/src/core/log.py @@ -94,7 +94,18 @@ class Logger(object): except AttributeError: if self.filter_name is not None: raise ValueError("Bad filter: filters must have a .filter method") - return self.fmt % record if self.fmt is not None else message + try: + return self.fmt % record + except TypeError: + return message + except KeyError as e: + if e.args[0] == 'profile': + # XXX: %(profile)s use some magic with introspection, for debugging purpose only *DO NOT* use in production + record['profile'] = _getProfile() + return self.fmt % record + else: + raise e + def debug(self, msg): self.log(C.LOG_LVL_DEBUG, msg) @@ -159,6 +170,30 @@ class FilterName(object): return self.filter(log_record) == 1 +def _getProfile(): + """Try to find profile value using introspection""" + import inspect + stack = inspect.stack() + current_path = stack[0][1] + for frame_data in stack[:-1]: + if frame_data[1] != current_path: + break + + frame = frame_data[0] + args = inspect.getargvalues(frame) + try: + profile = args.locals.get('profile') or args.locals['profile_key'] + except (TypeError, KeyError): + try: + try: + profile = args.locals['self'].profile + except AttributeError: + profile = args.locals['self'].parent.profile + except Exception: + # we can't find profile, we return an empty value + profile = '' + return profile + def _ansiColors(level, message): """Colorise message depending on level for terminals