Python logger.debug将参数转换为字符串而不记录

时间:2016-02-15 13:56:56

标签: python logging optimization

我正在优化执行某种计算的Python程序。它非常广泛地使用NumPy。代码中添加了logger.debug个调用(logger是标准的Python日志对象)。

当我运行cProfile时,我看到Numpy将数组转换为字符串的函数占用了50%的执行时间。这是令人惊讶的,因为没有处理程序将消息输出为DEBUG级别,只有INFO及以上。

为什么记录器将其参数转换为字符串,即使没有人会使用此字符串?有没有办法阻止它(除了不执行记录器调用)?

2 个答案:

答案 0 :(得分:4)

如果没有看到你的代码,就很难分辨出发生了什么,但是查看Python {2}和Python3.4的logging.__init__.py的源代码(我曾经说过的话)显示了对{{ 1}}例如,看起来像:

logger.debug(...)

这意味着如果未启用if self.isEnabledFor(DEBUG): self._log(DEBUG, msg, args, **kwargs) DEBUG将不会对任何参数进行任何处理。

一个简短的说明,我之前已经烧过,但是在调用logger之前你可能会意外地构建字符串。请注意区别:

logging.debug(...)

不同之处在于第一行在进入logger.debug("My big array: %s" % myBigArray) ## DON'T DO THIS logger.debug("My big array: %s", myBigArray) ## much better 之前进行字符串格式化 - 您传入的是一个(可能很大的)字符串。另一方面,第二行只有在启用logger.debug时才会进行字符串格式化。

答案 1 :(得分:0)

使用logger.debug('%s', myArray)而不是logger.debug(myArray)。第一个参数应该是一个格式字符串(正如所有文档和示例所示)并且不会被假定为计算上昂贵的。但是,正如@dwanderson指出的那样,只有在为该级别启用了记录器时才会发生日志记录。

请注意,您不是强制将格式字符串作为第一个参数传递 - 您可以传递一个代理对象,该对象将在调用str()时返回该字符串(此也记录在案)。在你的情况下,这就是数组到字符串转换的可能性。

如果您以您应该的方式使用日志记录(即记录),则不应该出现此处描述的问题。