Python - 记录器字符串格式

peu*_*ing 3 python logging string-formatting

据我了解,

 'hello {0}'.format("world")
Run Code Online (Sandbox Code Playgroud)

慢于:

"hello %s" % "world"
Run Code Online (Sandbox Code Playgroud)

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

logger.debug("hello %s", "world")
Run Code Online (Sandbox Code Playgroud)

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

logger.debug("hello %s" % "world")
Run Code Online (Sandbox Code Playgroud)

Jon*_*ley 11

不要忘记,如果您最终使用Sentry等日志聚合服务,那么所有调用都会:

logger.error("hello %s", planet)
Run Code Online (Sandbox Code Playgroud)

将被分组在一起作为同一错误的多次出现,同时所有调用:

logger.error("hello %s" % (planet,))
Run Code Online (Sandbox Code Playgroud)

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

此分组行为基于日志记录调用的第一个参数的值.在第一个例子中,它们都是相同的,而在第二个例子中,它们都依赖于"行星"的价值.

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


jfs*_*jfs 5

logger.debug(msg, arg1, arg2)内部做:msg = msg % (arg1, arg2)记载,这里并不令人惊讶.

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


lvc*_*lvc 4

任何差异都可以忽略不计。记录器花费的时间主要取决于其输出通道的速度 - 而 IO总是很慢。%与 相比,记录器之间的差异.format约为每个字符串半微秒。平均而言,记录器会花费比这多得多的时间(可能是几秒钟)来实际记录每个字符串。