1

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

让我们来看看这个 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 上。

4

2 回答 2

6

logging文档中:(强调我的)

 logging.basicConfig(**kwargs)

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

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

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

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

于 2019-05-30T13:16:30.420 回答
5

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

于 2019-05-30T15:18:13.753 回答