これは、ログが printf スタイルの書式設定のみを使用していることがわかったときの問題に対する私の解決策でした。ロギング呼び出しを同じままにすることができます - のような特別な構文はありませんlog.info(__("val is {}", "x"))
。コードに必要な変更は、ロガーを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}
使用法は次のとおりです。
log = StyleAdapter(logging.getLogger(__name__))
log.info("a log message using {type} substitution", type="brace")
中括弧置換に使用されるキーワードにlevel
、msg
、args
、exc_info
、extra
またはが含まれる場合、この実装には問題があることに注意してくださいstack_info
。これらは、 のlog
メソッドで使用される引数名ですLogger
。これらの名前のいずれかが必要な場合は、変更してこれらの名前を除外するか、呼び出しからprocess
削除します。さらに、この実装では、Logger 用のスペルミスのあるキーワード (例: ) も黙って無視します。log_kwargs
_log
ectra