Python,如何避免对低于当前级别的日志语句进行参数评估

anv*_*erx 5 python optimization logging arguments

假设我有这样的声明

logging.debug('%r', do_really_expensive_computation())
or
logging.debug('%r', find_my_object().do_really_expensive_computation())
Run Code Online (Sandbox Code Playgroud)

当日志记录级别设置为以上时,DEBUG它不会记录日志,但它仍然会在调用之前评估参数logging.debug(),并且执行do_really_expensive_computation()find_my_object()可能相当繁重。

当低于当前级别时,是否有任何好的模式可以跳过日志记录中涉及的所有计算?

blh*_*ing 8

一种方法是创建一个帮助器类,其中的__repr__方法返回给定回调函数的值,并将使用昂贵的函数对象初始化的帮助器类的实例传递给记录器以进行惰性求值:

class r:
    def __init__(self, callback):
        self.callback = callback

    def __repr__(self):
        return repr(self.callback())
Run Code Online (Sandbox Code Playgroud)

以便:

import logging

def expensive():
    print('this is expensive')
    return 1

print('debug:')
logging.debug('%r', r(expensive))
print('error:')
logging.error('%r', r(expensive))
Run Code Online (Sandbox Code Playgroud)

输出:

debug:
error:
this is expensive
ERROR:root:1
Run Code Online (Sandbox Code Playgroud)