完全禁用python日志记录

时间:2014-12-25 12:11:59

标签: python logging

在我的代码中,我使用logging.info(...,之前我使用logging.basicConfig(filename=...进行配置。是否可以在没有它们做任何事情的情况下将记录行保留在代码中?

4 个答案:

答案 0 :(得分:1)

编辑:disabled似乎不应该供公众使用。看看Maggyero对替代解决方案的回答。

只需禁用日志处理程序,它就不会再写任何内容了。

logging.getLogger().disabled = True

请注意,每个记录器都可以有处理程序,因此可能会有更多。

答案 1 :(得分:1)

使用主要API

在日志记录Python库中,可以通过以下方式完全禁用特定记录器的记录(对于所有级别):

  • 向其添加logging.NullHandler()处理程序(以避免logging.lastResort处理程序并将其propagate属性设置为False(以避免父记录程序的处理程序),或通过
  • 为其添加一个lambda record: False过滤器。

代码示例:

import logging

# 1st solution
logging.getLogger("foo").addHandler(logging.NullHandler())
logging.getLogger("foo").propagate = False

# 2nd solution
logging.getLogger("foo").addFilter(lambda record: False)

警告。-与第一种解决方案相反,第二种解决方案不会禁用子记录器(例如logging.getLogger("foo.bar"))的日志记录,因此,应该仅使用它来禁用子记录器的日志记录单个记录器。

注意。-将记录器的disabled属性设置为True并不是第三种解决方案,因为它不是公共API的一部分。参见https://bugs.python.org/issue36318。代码示例:

# NOT a 3rd solution
logging.getLogger("foo").disabled = True

使用配置API

或者,可以使用logging.config.dictConfig函数获得相同的行为。代码示例:

import logging.config

# 1st solution
logging.config.dictConfig({
    "version": 1,
    "handlers": {
        "null": {
            "class": "logging.NullHandler"
        }
    },
    "loggers": {
        "foo": {
            "handlers": ["null"],
            "propagate": False
        }
    }
})

# 2nd solution
logging.config.dictConfig({
    "version": 1,
    "filters": {
        "all": {
            "()": lambda: (lambda record: False)
        }
    },
    "loggers": {
        "foo": {
            "filters": ["all"]
        }
    }
})

答案 2 :(得分:0)

您可以使用:

logging.disable(logging.CRITICAL)

disable all logging calls,其级别为CRITICAL或以下。实际上,这会禁用所有日志记录调用。

您可以通过执行以下操作再次启用所有记录器的记录(在他们自己的记录级别):

logging.disable(logging.NOTSET)

答案 3 :(得分:0)

如果要完全禁用日志,首先应在 logging.basicConfig()中将levevl设置为 logging.NOTSET ,因为它是零级,然后 logging.getLogger( ).disabled 设置为 True或False https://docs.python.org/2/library/logging.html

完全禁用示例:

import logging

if __name__ == '__main__':
     logging.disable(logging.NOTSET)

     logging.basicConfig(
     format="%(levelname) -10s %(asctime)s %(filename)s:%(lineno)s  %(message)s",
     level=logging.NOTSET)

     logging.getLogger().disabled = True  # True, False

     logging.critical("Critical")
     logging.error("Error")
     logging.warning("Warning")
     logging.info("Info")
     logging.debug("Debug")