Python: how to do lazy debug logging

后端 未结 3 775
无人共我
无人共我 2020-12-16 21:30

I have some python like this:

def foo():
    logger = logging.getLogger()
    # do something here
    logger.debug(\'blah blah {}\'.format(expensive_func()))         


        
3条回答
  •  萌比男神i
    2020-12-16 22:11

    As Vinay Sajip suggests, you can do the following:

    def foo():
        logger = logging.getLogger()
        if logger.isEnabledFor(logging.DEBUG):
            logger.debug('blah blah {}'.format(expensive_func()))
            logger.debug('Message: {}'.format(expf_1(expf_2(some_arg))))
            logger.debug('Message: {}', Lazy(expf_1, Lazy(expf_2, some_arg)))
    foo()
    

    Which is already lazy!

    That's because the then-expressions

            logger.debug('blah blah {}'.format(expensive_func()))
            logger.debug('Message: {}'.format(expf_1(expf_2(some_arg))))
            logger.debug('Message: {}', Lazy(expf_1, Lazy(expf_2, some_arg)))
    

    are only evaluated if and only if logger.isEnabledFor(logging.DEBUG) returns True, i.e. if and only if their evaluation is needed.


    Even more

    logging.info(DeferredMessage(expensive_func, 1, 2))
    

    is not as lazy as one may think: DeferredMessage(expensive_func, 1, 2) have to be evaluated in an eager fashion. Which is in addition slower than evaluating:

        if logger.isEnabledFor(logging.DEBUG):
    

提交回复
热议问题