如果在声明之前调用logging.info(),则Python中的logging.basicConfig将无法工作

时间:2019-05-30 12:36:15

标签: python logging python-logging

根据此答案,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 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()

从终端以python -m verbose -v运行此脚本不会显示任何内容。

如果您像

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

然后按预期方式进行日志记录。

在定义logging.info()之前尝试调用basicConfig似乎将完全禁用所有日志记录。

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

我使用的是Python 3.6.7。

2 个答案:

答案 0 :(得分:2)

摘自logging文档:(强调我)

 logging.basicConfig(**kwargs)
     

通过创建带有默认Formatter的StreamHandler并将其添加到根目录来对日志记录系统进行基本配置   记录器。

     

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

     

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

因此,基本上,您第一次致电logging.info进行了一些自动配置。由于已经进行了自动配置,因此您以后的配置尝试静默失败了。

答案 1 :(得分:1)

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