Python 日志记录不会使用 basicConfig 设置日志记录级别

Python logging won't set a logging level using basicConfig

出于某种原因,logging.basicConfig 忽略了我提供的记录器级别。以下代码在我的一个脚本中:

# main.py
print logging.getLogger().getEffectiveLevel()
print logger_level
logging.basicConfig(format=logger_format,
                    level=logger_level,
                    )
print logging.getLogger().getEffectiveLevel()

输出为:

30
10
30

所以,它实际上并没有设置记录器级别。但是,如果我在交互式解释器中执行这段代码,我会得到以下输出:

30
10
10

这意味着我设置的日志记录级别很好。更令人困惑的是,这是最近发生的事情——我不知道我做了什么导致了这种行为。谁能提供一些见解?

编辑:如果有相关问题,我已经从 IDE(Sublime Text)以及命令行尝试了 运行 main.py,两者都使用同样的结果。我在基于 conda 的虚拟环境中工作,我已经尝试 运行 环境中的代码,而不是(但仅来自解释器 - 脚本无法处理一般环境)结果。

来自python logging module docs,

This function does nothing if the root logger already has handlers configured for it.

我的假设是您之前调用了 basicConfig(),它安装了处理程序。

尝试直接在根记录器上设置日志级别。

logging.getLogger().setLevel(logger_level)

如果您想更改格式,则需要为处理程序提供一个新的格式化程序。假设已将处理程序添加到根记录器,以下 可能 有效。

logging.getLogger().handlers[0].setFormatter(logging.Formatter(logger_format))

我(愚蠢地)遇到的一个问题是没有将 logging.basicConfig() 放在主文件的顶部。

来自the docs

The above module-level convenience functions (debug, info, warn, error, fatal), which delegate to the root logger, call basicConfig() to ensure that at least one handler is available.

This function (basicConfig()) does nothing if the root logger already has handlers configured, unless the keyword argument force is set to True.

我在脚本中调用 logging.BasicConfig() 之前调用了一个记录消息的函数,因此记录器的级别设置为默认值,而不是我想要的级别。

如果无法将记录器移到文件中更高的位置,您有两个选择:

Python 3.8及以上:

logging.basicConfig(level=logging.INFO, force=True)

Python 2.x 和 Python 3.x:

logging.getLogger().setLevel(logger_level)

要查看 basicConfig() 覆盖操作,试试这个:

import logging

logging.info("Can't see me!")
logging.warn("Peekabo")

logging.basicConfig(level=logging.INFO)
logging.info("Hidden again!")

logging.basicConfig(level=logging.INFO, force=True)
logging.info("You found me!")