Python - 记录器字符串格式

时间:2012-07-21 04:14:13

标签: python logging string-formatting

据我所知,

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

慢于:

"hello %s" % "world"

我的问题是,logger如何在传递时格式化字符串:

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

假设日志永远不会被关闭,那么最好这样做:

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

3 个答案:

答案 0 :(得分:11)

不要忘记,如果你最终使用像Sentry这样的日志记录聚合服务,那么所有的调用都是:

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

将组合在一起作为同一错误的多次出现,而所有调用都是:

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

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

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

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

答案 1 :(得分:5)

logger.debug(msg, arg1, arg2) internallymsg = msg % (arg1, arg2)documented,所以不会感到惊讶。

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

答案 2 :(得分:4)

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