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。
来自logging文档:(强调我的)
Run Code Online (Sandbox Code Playgroud)logging.basicConfig(**kwargs)通过创建带有默认格式化程序的 StreamHandler 并将其添加到根记录器,为日志记录系统进行基本配置。
如果没有为根记录器定义处理程序,函数 debug()、info()、warning()、error() 和 critical() 将自动调用 basicConfig()。
如果根记录器已经为其配置了处理程序,则此函数不执行任何操作。
所以基本上你的第一次调用进行logging.info了一些自动配置。由于已经发生了自动配置,您稍后的配置尝试以静默方式失败。
不要使用 basicConfig 来更改级别。用于logging.getLogger().setLevel(logging.DEBUG)更改根记录器的级别。人们也可以在任何记录器或处理程序上执行此操作。