如何按方法/函数禁用日志记录?

17 投票
6 回答
13565 浏览
提问于 2025-04-17 01:44

我刚接触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 )

撰写回答