优化Python日志代码

Jon*_*sco 1 python logging pyramid

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

我们真的利用标准导入库来登录这个(用于调试).

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

我想知道是否有人根据需要有最小化日志记录的有效策略,因此这些代码可以在我们的生产环境执行期间"优化掉"而根本不运行.

例如,在mod_perl下,编译器将"优化"在False常量下运行的语句

在psuedocode ...(我很久没有触及perl!)

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

要么

use constant DEBUG => False ;
DEBUG && log.debug("stuff here " + string );
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以推荐一种在Python下模仿这种行为的有效方法吗?

Mar*_*ers 8

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

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

if logger.isEnabledFor(logging.DEBUG):
    logger.debug('Message with %s, %s', expensive_func1(),
                                        expensive_func2())
Run Code Online (Sandbox Code Playgroud)

请参阅Logging HOWTO优化部分.


kin*_*all 6

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