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

Ale*_*kov 1 python logging python-logging

基于此答案,启用详细日志记录的更简单方法

让我们以这个 Python 脚本为例。

import argparse
import logging


def main():
    import argparse
    import logging

    parser = argparse.ArgumentParser(
        description='A test script for http://stackoverflow.com/q/14097061/78845'
    )
    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()
Run Code Online (Sandbox Code Playgroud)

从终端运行此脚本 aspython -m verbose -v不会打印任何内容。

如果您logging.info('Starting script!')将文件中的行注释为

if __name__ == "__main__":
    #logging.info('Starting script!')
    main()
Run Code Online (Sandbox Code Playgroud)

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

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

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

我使用的是 Python 3.6.7。

dgw*_*dgw 6

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

 logging.basicConfig(**kwargs)
Run Code Online (Sandbox Code Playgroud)

通过创建带有默认格式化程序的 StreamHandler 并将其添加到根记录器,为日志记录系统进行基本配置。

如果没有为根记录器定义处理程序,函数 debug()、info()、warning()、error() 和 critical() 将自动调用 basicConfig()。

如果根记录器已经为其配置处理程序,则此函数不执行任何操作

所以基本上你的第一次调用进行logging.info了一些自动配置。由于已经发生了自动配置,您稍后的配置尝试以静默方式失败。


Dan*_* D. 6

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