我是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...
Run Code Online (Sandbox Code Playgroud)
当我在'my_func1'上完成工作并开始处理第二个函数'my_func2'时,来自'my_func1'的日志消息开始从"有用"变为"杂乱".
是否存在单行魔术语句,例如'logging.disabled_in_this_func()',我可以将其添加到'my_func1'的顶部以禁用'my_func1'中的所有日志记录调用,但仍然在所有其他函数/方法中保留日志记录调用不变?
谢谢
linux,Python 2.7.1
S.L*_*ott 12
诀窍是创建多个记录器.
这有几个方面.
第一.不要logging.basicConfig()在模块的开头使用.仅在主导入开关内使用它
if __name__ == "__main__":
logging.basicConfig(...)
main()
logging.shutdown()
Run Code Online (Sandbox Code Playgroud)
第二.除了设置全局首选项外,永远不要获取"root"记录器.
第三.为可能启用或禁用的内容获取单独的命名记录器.
log = logging.getLogger(__name__)
func1_log = logging.getLogger( "{0}.{1}".format( __name__, "my_func1" )
Run Code Online (Sandbox Code Playgroud)
现在,您可以在每个命名记录器上设置日志记录级别.
log.setLevel( logging.INFO )
func1_log.setLevel( logging.ERROR )
Run Code Online (Sandbox Code Playgroud)
您可以创建一个暂时挂起日志记录的装饰器,ala:
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(): ...
Run Code Online (Sandbox Code Playgroud)
警告:这也会暂停从my_func1调用的任何函数的日志记录,所以要小心你如何使用它.