【发布时间】:2014-01-27 09:21:05
【问题描述】:
我有一些像这样的python:
def foo():
logger = logging.getLogger()
# do something here
logger.debug('blah blah {}'.format(expensive_func()))
foo()
其中expensive_func() 是一个返回字符串的函数,执行起来很昂贵。
开发时,日志级别设置为DEBUG,执行expensive_func(),记录消息,一切正常。
问题是当我将日志级别设置为严格大于 DEBUG 时,比如说 WARNING,在生产环境中,显然expensive_func() 的返回值不会被记录,但是昂贵的函数本身仍然会被执行。
我的问题是:如何防止python在日志级别为WARNING时执行昂贵的功能?
我不想删除该调试行或在昂贵的函数中添加类似if level > DEBUG: return 的内容。
谢谢。
编辑
我刚才访问了Lazy logger message string evaluation,但对它并不满意,主要是因为:
- 有点难看;
- 即使我用一些 Lazy 类包装了昂贵的函数,当我有两个昂贵的函数时我应该怎么办? (如下所示)。
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)))
【问题讨论】:
-
我更新了我的答案以解决您的评论。
标签: python logging lazy-evaluation