Python-日志记录器字符串格式化

6
据我所了解,
 'hello {0}'.format("world")

比...慢:
"hello %s" % "world"

我的问题是,当像这样传递字符串时,日志记录器是如何格式化字符串的:
logger.debug("hello %s", "world")

假设日志永不关闭,那么最好的做法是这样的:
logger.debug("hello %s" % "world")
3个回答

14

不要忘记,如果您最终使用诸如Sentry之类的日志聚合服务,则所有调用:

logger.error("hello %s", planet)

将被归为同一错误的多个出现次数,而所有对以下内容的调用:

logger.error("hello %s" % (planet,))

会被列为许多不同的错误,每个错误只出现一次。这可能会使确定实际经常发生的错误变得困难。

此分组行为基于记录调用的第一个参数的值。在第一个示例中,它们都相同,而在第二个示例中,它们都依赖于“planet”的值。

因此,重要的是不要在传递给记录器的字符串上使用“%”或.format运算符。让记录调用为您完成这项工作。


7

logger.debug(msg, arg1, arg2)会在内部执行:msg = msg % (arg1, arg2),如所述,因此没有什么意外。

logger.debug(msg, arg1, arg2, ...)看起来比logger.debug(msg % (arg1, arg2, ...))更整洁,并且不会过早地执行格式化。


4

任何差异都将是可以忽略不计的。记录器所花费的时间取决于其输出通道的速度 - 而IO始终很慢。使用%.format相比,记录器之间的差异大约为每个字符串半微秒。平均而言,记录器实际上记录每个字符串时将花费相当长的时间 - 可能是几秒钟。


难道不是IO异步完成而插值同步完成吗? - Adam Parkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接