Nov-04-2018, 05:58 AM
(This post was last modified: Nov-04-2018, 06:56 AM by Gribouillis.)
In this alternative version, we only patch the logger instance by adding or updating a member
_log
without changing its typeimport logging __version__ = "2018.11.04.1" class BraceMessage(object): #see: https://docs.python.org/3/howto/logging-cookbook.html#using-custom-message-objects def __init__(self, msg, args, kwargs): self.msg = msg self.args = args self.kwargs = kwargs def __str__(self): try: return str(self.msg).format(*self.args, **self.kwargs) except Exception as exc: return "Interpolation error during message formatting\n .format({}, *{}, **{})\n{}: {}".format( repr(self.msg), self.args, self.kwargs, type(exc).__name__, str(exc)) class _LogMethod: _reserved = (('exc_info', None), ('extra', None), ('stack_info', False)) def __init__(self, logger): self._log = logger._log def __call__(self, level, msg, args, **kwargs): d = {k: kwargs.pop(k, v) for k, v in self._reserved} return self._log(level, BraceMessage(msg, args, kwargs), (), **d) def getLogger(name): logger = logging.getLogger(name) logger._log = _LogMethod(logger) return logger if __name__ == '__main__': logging.basicConfig() log = getLogger(__name__) log.setLevel(logging.DEBUG) log.info("{} Today's wisdom is that {x} + {y} = {z}", 'Hello!', x=1, z=3, y=2) try: 1./0. except Exception: log.exception('Something {} happened!', 'BAD') log.warning("This is the END...")