禁用每个方法/功能的记录?

JS.*_*JS. 14 python logging

我是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)

  • "不推荐使用根记录器".期.不要使用它.它是"匿名的".您只需要命名记录器,以便配置和筛选. (2认同)

Kir*_*ser 6

您可以创建一个暂时挂起日志记录的装饰器,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调用的任何函数的日志记录,所以要小心你如何使用它.

  • 如果我错了,请纠正我,但在我看来,这只会禁用一个名为“log”的记录器。如果同时使用多个记录器,例如在 Django 应用程序中,如何禁用所有记录器? (2认同)