I have some python like this:
def foo():
logger = logging.getLogger()
# do something here
logger.debug('blah blah {}'.format(expensive_func()))
foo()
where expensive_func()
is a function that returns string and that it is expensive to execute.
When developping, the log level is set to DEBUG, and expensive_func()
get executed, the message get logged, everything is fine.
The problem is that when I set the log level strictly greater than DEBUG, say WARNING, in production env, obviously the return value of expensive_func()
won't get logged, but the expensive function itself will still be executed.
My question is: how to prevent python from excutting the expensive function when the logging level is WARNING?
I don't want to delete that debug line or add something like if level > DEBUG: return
in the expensive function.
Thanks.
EDIT
I visited Lazy logger message string evaluation just now, but not satisfied with it, mainly because:
- It's some what ugly;
- Even if I wrap the expensive function with some Lazy class, what shoud I do when I have two expensive functions? (shown below).
class Lazy:
def __init__(self, func, *a, **ka):
self.func= func
self.a = a
self.ka= ka
def __str__(self):
return str(self.func(*self.a, **self.ka))
# Though this is ugly, it works
logger.debug('Message: %s', Lazy(expensive_func))
# What if I wanted to do this?
# logger.debug('Message: {}'.format(expf_1(expf_2(some_arg))))
# Maybe I can modify class Lazy to make something like this to work
# but it really doesn't feel right
# logger.debug('Message: {}', Lazy(expf_1, Lazy(expf_2, some_arg)))