如何禁用其他模块的记录器?

时间:2014-12-18 03:40:40

标签: python logging

我在项目中使用了几个模块,但是,模块会从记录器中输出大量日志,这很烦人。所以我通过以下方式关闭日志:

boto_log = logging.getLogger("boto")
boto_log.setLevel(logging.CRITICAL)
es_log = logging.getLogger("elasticsearch")
es_log.setLevel(logging.CRITICAL)
urllib3_log = logging.getLogger("urllib3")
urllib3_log.setLevel(logging.CRITICAL)

虽然这有效,但代码看起来很冗长。有没有更好,更简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:5)

可能你可以重构它以削减一些样板:

for _ in ("boto", "elasticsearch", "urllib3"):
    logging.getLogger(_).setLevel(logging.CRITICAL)

答案 1 :(得分:5)

您可以使用logging.config.dictConfiglogging.config.fileConfig

禁用现有记录器
import logging.config
logging.config.dictConfig({
    'version': 1,
    # Other configs ...
    'disable_existing_loggers': True
})

您还可以循环使用现有记录器并手动禁用。

for name, logger in logging.root.manager.loggerDict.iteritems():
    logger.disabled=True

答案 2 :(得分:0)

您应该确切知道应该禁用的记录器名称。 "urllib3.connectionpool" != "urllib3"

logging.getLogger("boto").disabled = True
logging.getLogger("elasticsearch").disabled = True
logging.getLogger("urllib3").disabled = True
logging.getLogger('urllib3.connectionpool').disabled = True

答案 3 :(得分:0)

您可以从logging.root.manager.loggerDict获取所有记录器(不包括根记录器)的列表。

for _ in logging.root.manager.loggerDict:
    logging.getLogger(_).setLevel(logging.CRITICAL)
    # logging.getLogger(_).disabled = True  # or use this instead of CRITICAL if you'd rather completely disable it

如果您确实希望保留一些记录器,则可以灵活地放入自己的过滤器等。