1

我有一个在 Pyramid 框架上编写的 Python 应用程序。

我们使用标准导入库真正利用了登录(用于调试)。

当我们在生产环境中分析内容时,我们的日志记录活动似乎有相当多的开销。所有的字符串格式和循环加起来。我很想删除它,但我们不能——我们确实需要保留它以进行测试,有时还需要在生产环境中进行调试。

我想知道是否有人有有效的策略来根据需要最小化日志记录,所以这段代码可以在我们的生产环境中执行期间被“优化掉”并且根本无法运行。

例如,在 mod_perl 下,编译器会“优化掉”在 False 常量下运行的语句

在伪代码中......(我很久没有接触过perl了!)

use constant DEBUG => False ;
if ( DEBUG ) {
      log.debug("stuff here " + string );
}

或者

use constant DEBUG => False ;
DEBUG && log.debug("stuff here " + string );

在这些情况下,对 log.debug 的调用甚至字符串插值都不会发生。

谁能推荐一种在 Python 下模仿该行为的有效方法?

4

3 回答 3

9

使用__debug__. 此标志设置为False当 Python 使用-O命令行标志运行时,Python 将在编译时进一步优化调试代码。几个月前我写了一篇关于它的博客文章。

于 2013-05-16T18:43:12.437 回答
9

可以使用时不要使用连接log.debug('stuff here %s', string);日志记录模块推迟插值,直到在记录时实际格式化字符串。如果DEBUG日志级别已禁用,则不会发生插值。

您还可以测试日志记录级别以避免收集昂贵的日志记录信息,除非需要:

if logger.isEnabledFor(logging.DEBUG):
    logger.debug('Message with %s, %s', expensive_func1(),
                                        expensive_func2())

请参阅Logging HOWTO 的优化部分

于 2013-05-16T18:50:31.550 回答
0

我建议assert用于此目的,因为它在优化模式下很好地优化了。

在这种情况下,无需手动检查是否启用了日志记录级别。这在执行对日志记录有用的昂贵格式化操作时特别有用(例如使用pprint模块)。

一个例子:

代替

logging.debug('my message %s', pprint.pformat(mycomplexdata))

你会写

assert(logging.debug('my message %s', pprint.pformat(mycomplexdata)) or True)

(该部分or True确保断言不会失败。)

甚至可以.format在这种情况下使用-O.

assert(logging.debug('my message {}'.format(pprint.pformat(mycomplexdata))) or True)

当使用-O.

于 2017-04-22T09:32:14.733 回答