5

据我了解,

 'hello {0}'.format("world")

慢于:

"hello %s" % "world"

我的问题是,记录器在传递时如何格式化字符串,如下所示:

logger.debug("hello %s", "world")

并假设日志永远不会被关闭,这样做会更好:

logger.debug("hello %s" % "world")
4

3 回答 3

13

不要忘记,如果您最终使用了 Sentry 等日志聚合服务,那么所有对以下的调用:

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

将被归为同一错误的多次出现,而所有调用:

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

将被列为许多不同的错误,每个错误都发生一次。这使得很难对哪些错误实际上经常发生进行分类。

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

因此,重要的是不要在传递给日志记录的字符串上使用 '%' 或 .format 运算符。让日志调用为您完成。

于 2012-11-14T08:42:18.303 回答
6

logger.debug(msg, arg1, arg2)内部执行:msg = msg % (arg1, arg2)文件所述,因此这里不足为奇。

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

于 2012-07-21T04:56:28.527 回答
4

任何差异都可以忽略不计。记录器花费的时间主要受其输出通道速度的影响——而 IO总是很慢。使用%比较的记录器之间的差异.format将是每个字符串大约半微秒。平均而言,记录器将花费比这更多的时间 - 可能是几秒钟 - 实际记录每个字符串。

于 2012-07-21T04:54:56.047 回答