根据此答案,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。
答案 0 :(得分:2)
摘自logging
文档:(强调我)
logging.basicConfig(**kwargs)
通过创建带有默认Formatter的StreamHandler并将其添加到根目录来对日志记录系统进行基本配置 记录器。
函数debug(),info(),warning(),error()和 如果没有处理程序,critical()将自动调用basicConfig() 为根记录器定义。
如果根记录器已经为其配置了处理程序,则此功能将不执行任何操作。
因此,基本上,您第一次致电logging.info
进行了一些自动配置。由于已经进行了自动配置,因此您以后的配置尝试静默失败了。
答案 1 :(得分:1)
请勿使用basicConfig更改级别。使用logging.getLogger().setLevel(logging.DEBUG)
更改根记录器的级别。也可以在任何记录器或处理程序上执行此操作。