Mercurial > libervia-backend
diff src/core/log.py @ 1008:d70d4fe5c5f8
core (log): added magic %(profile)s key to log_fmt:
if %(profile)s is used in log_fmt, SàT try to find profile value using introspection. This is for debugging purpose only, *DO NOT* use in production. This key don't work (yet ?) with standard backend, and will not work in every frontend.
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 05 May 2014 18:58:34 +0200 |
parents | a7d33c7a8277 |
children | 73a0b7f94674 |
line wrap: on
line diff
--- a/src/core/log.py Mon May 05 18:58:34 2014 +0200 +++ b/src/core/log.py Mon May 05 18:58:34 2014 +0200 @@ -94,7 +94,18 @@ 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 @@ 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