如何按方法/函数禁用日志记录?
我刚接触Python的日志功能,发现它比我自己想出来的解决方案要好用多了。
我有一个问题一直找不到答案:怎么在每个方法或函数中单独关闭日志信息呢?
假设我的模块里只有一个函数。在开发过程中,日志调用对我帮助很大:
logging.basicConfig(level=logging.DEBUG,
format=('%(levelname)s: %(funcName)s(): %(message)s'))
log = logging.getLogger()
my_func1():
stuff...
log.debug("Here's an interesting value: %r" % some_value)
log.info("Going great here!")
more stuff...
但是当我完成了'我的函数1'(my_func1)的工作,开始写第二个函数'我的函数2'(my_func2)时,'我的函数1'的日志信息就从“有用”变成了“杂乱无章”。
有没有什么简单的一行代码,比如'slogging.disabled_in_this_func()',可以让我在'我的函数1'的顶部加上,来关闭'我的函数1'里的所有日志调用,而不影响其他函数的日志调用呢?
谢谢
linux,Python 2.7.1
6 个回答
3
你可以使用一个装饰器:
import logging
import functools
def disable_logging(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
logging.disable(logging.DEBUG)
result = func(*args,**kwargs)
logging.disable(logging.NOTSET)
return result
return wrapper
@disable_logging
def my_func1(...):
8
你可以创建一个装饰器,暂时停止记录日志,像这样:
from functools import wraps
def suspendlogging(func):
@wraps(func)
def inner(*args, **kwargs):
previousloglevel = log.getEffectiveLevel()
try:
return func(*args, **kwargs)
finally:
log.setLevel(previousloglevel)
return inner
@suspendlogging
def my_func1(): ...
注意:这样做也会停止记录从my_func1调用的任何函数的日志,所以使用时要小心。
15
诀窍是创建多个日志记录器。
这有几个方面需要注意。
首先,不要在模块的开头使用 logging.basicConfig()
。要在主导入开关里面使用它,仅此而已。
if __name__ == "__main__":
logging.basicConfig(...)
main()
logging.shutdown()
第二,除了设置全局偏好之外,永远不要获取“根”日志记录器。
第三,为那些可能会启用或禁用的功能获取单独的 命名 日志记录器。
log = logging.getLogger(__name__)
func1_log = logging.getLogger( "{0}.{1}".format( __name__, "my_func1" )
现在你可以为每个命名的日志记录器设置日志级别。
log.setLevel( logging.INFO )
func1_log.setLevel( logging.ERROR )