据我所知,
'hello {0}'.format("world")
慢于:
"hello %s" % "world"
我的问题是,logger如何在传递时格式化字符串:
logger.debug("hello %s", "world")
假设日志永远不会被关闭,那么最好这样做:
logger.debug("hello %s" % "world")
答案 0 :(得分:11)
不要忘记,如果你最终使用像Sentry这样的日志记录聚合服务,那么所有的调用都是:
logger.error("hello %s", planet)
将组合在一起作为同一错误的多次出现,而所有调用都是:
logger.error("hello %s" % (planet,))
将列出许多不同的错误,每个错误都发生一次。这可能使得很难对实际经常发生的错误进行分类。
此分组行为基于日志记录调用的第一个参数的值。在第一个例子中,它们都是相同的,而在第二个例子中,它们都取决于“行星”的价值。
因此,不要在传递给日志记录的字符串上使用'%'或.format运算符。让日志记录调用为您完成。
答案 1 :(得分:5)
logger.debug(msg, arg1, arg2)
internally:msg = msg % (arg1, arg2)
为documented,所以不会感到惊讶。
logger.debug(msg, arg1, arg2, ...)
可能看起来比logger.debug(msg % (arg1, arg2, ...))
更整洁,并且不会过早执行格式化。
答案 2 :(得分:4)
任何差异都可以忽略不计。记录器所花费的时间主要受其输出通道的速度影响 - 并且IO 总是慢。使用%
与.format
进行比较的记录器之间的差异将是每个字符串大约半微秒。平均而言,记录器将花费相当多的时间 - 可能是几秒钟 - 实际上记录每个字符串。