如果在声明之前调用 logging.info(),Python 中的 logging.basicConfig 将不起作用

logging.basicConfig in Python won't work if calling logging.info() before declaring

根据这个答案,Easier way to enable verbose logging

让我们使用这个 Python 脚本。

import argparse
import logging


def main():
    import argparse
    import logging

    parser = argparse.ArgumentParser(
        description='A test script for 
    )
    parser.add_argument("-v", "--verbose", help="increase output verbosity",
                        action="store_true")

    args = parser.parse_args()
    if args.verbose:
        logging.basicConfig(level=logging.DEBUG)

    logging.info('Shown in debug and info mode')
    logging.debug('Only shown in debug mode')


if __name__ == "__main__":
    logging.info('Starting script!')
    main()

运行 来自终端的此脚本作为 python -m verbose -v 不会打印任何内容。

如果您像

一样注释文件中的 logging.info('Starting script!')
if __name__ == "__main__":
    #logging.info('Starting script!')
    main()

然后日志记录按预期工作。

看起来在定义 basicConfig 之前尝试调用 logging.info() 将完全禁用任何日志记录。

这是 logging 中的错误还是常见问题,为什么会发生这种情况?

我在 Python 3.6.7.

来自 logging 文档:(强调我的)

 logging.basicConfig(**kwargs)

Does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger.

The functions debug(), info(), warning(), error() and critical() will call basicConfig() automatically if no handlers are defined for the root logger.

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

所以基本上您对 logging.info 的第一次调用进行了一些自动配置。由于已经发生的自动配置,您后来的配置尝试无提示地失败了。

不要使用 basicConfig 更改级别。使用 logging.getLogger().setLevel(logging.DEBUG) 更改根记录器的级别。也可以在任何记录器或处理程序上执行此操作。