Dies war meine Lösung für das Problem, als ich feststellte, dass bei der Protokollierung nur die Formatierung im printf-Stil verwendet wird. Dadurch können Protokollierungsaufrufe gleich bleiben - keine spezielle Syntax wie z log.info(__("val is {}", "x")). Die für den Code erforderliche Änderung besteht darin, den Logger in a zu verpacken StyleAdapter.
from inspect import getargspec
class BraceMessage(object):
def __init__(self, fmt, args, kwargs):
self.fmt = fmt
self.args = args
self.kwargs = kwargs
def __str__(self):
return str(self.fmt).format(*self.args, **self.kwargs)
class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger):
self.logger = logger
def log(self, level, msg, *args, **kwargs):
if self.isEnabledFor(level):
msg, log_kwargs = self.process(msg, kwargs)
self.logger._log(level, BraceMessage(msg, args, kwargs), (),
**log_kwargs)
def process(self, msg, kwargs):
return msg, {key: kwargs[key]
for key in getargspec(self.logger._log).args[1:] if key in kwargs}
Verwendung ist:
log = StyleAdapter(logging.getLogger(__name__))
log.info("a log message using {type} substitution", type="brace")
Es ist erwähnenswert, dass diese Umsetzungsprobleme haben , wenn Schlüsselwörter für Klammer Substitution verwendet wurden , umfassen level, msg, args, exc_info, extraoder stack_info. Dies sind Argumentnamen, die von der logMethode von verwendet werden Logger. Wenn Sie einen dieser Namen benötigen, ändern Sie diese process, um diese Namen auszuschließen, oder entfernen Sie sie einfach log_kwargsaus dem _logAnruf. Darüber hinaus ignoriert diese Implementierung auch stillschweigend falsch geschriebene Schlüsselwörter, die für den Logger bestimmt sind (z. B. ectra).
log.debug("format this message%d" % 1)