这是另一个没有在Dunes答案中提到的关键字问题的选项。它只能处理位置({0}
)参数,而不能处理关键字({foo}
)参数。它还不需要两次格式化调用(使用下划线)。它确实具有子类化的缺点str
:
class BraceString(str):
def __mod__(self, other):
return self.format(*other)
def __str__(self):
return self
class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super(StyleAdapter, self).__init__(logger, extra)
def process(self, msg, kwargs):
if kwargs.pop('style', "%") == "{":
msg = BraceString(msg)
return msg, kwargs
您可以这样使用它:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
当然,您可以删除标有的复选框,# optional
以强制所有消息通过适配器使用新格式。
多年后阅读此答案的人请注意:从Python 3.2开始,您可以将style参数与Formatter
对象一起使用:
日志记录(从3.2版本开始)为这两种其他格式设置样式提供了改进的支持。Formatter类得到了增强,可以使用名为的其他可选关键字参数style
。默认为'%'
,但其他可能的值为'{'
和'$'
,它们对应于其他两种格式样式。向后兼容性默认情况下保持不变(如您所愿),但是通过显式指定样式参数,您可以指定使用str.format()
或的
格式字符串string.Template
。
该文档提供了示例
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
请注意,在这种情况下,您仍然无法logger
使用新格式调用。即,以下仍然无效:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)