更简单的方法来启用详细的日志logging

我想添加一个debugging打印语句testing,如果我从命令行启用--verbose ,如果我在脚本中有以下内容。

 logger.info("test") 

我经历了以下问题,但无法得到答案…

  • 如何在脚本中实现–verbose或-v选项?

  • Python日志logging – DEBUG下面有什么东西吗?

您需要将Argparse Tutorial的智慧与Python的Logging HOWTO结合起来。 这是一个例子…

 > cat verbose.py #!/usr/bin/env python 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.debug('Only shown in debug mode') 

运行帮助:

 > ./verbose.py -h usage: verbose.py [-h] [-v] A test script for http://stackoverflow.com/q/14097061/78845 optional arguments: -h, --help show this help message and exit -v, --verbose increase output verbosity 

以详细模式运行:

 > ./verbose.py -v DEBUG:root:Only shown in debug mode 

静静地运行:

 > ./verbose.py > 

我发现--verbose (对于用户)和--debug (对于开发者)是有用的。 以下是我如何使用loggingargparse

 import argparse import logging parser = argparse.ArgumentParser() parser.add_argument( '-d', '--debug', help="Print lots of debugging statements", action="store_const", dest="loglevel", const=logging.DEBUG, default=logging.WARNING, ) parser.add_argument( '-v', '--verbose', help="Be verbose", action="store_const", dest="loglevel", const=logging.INFO, ) args = parser.parse_args() logging.basicConfig(level=args.loglevel) 

所以,如果设置了--debug ,日志级别设置为DEBUG 。 如果--verbose ,日志logging设置为INFO 。 如果两者都不相同,则缺less--debug日志logging级别设置为WARNING的缺省值。

这是一个更简洁的方法,它会进行边界检查,并在帮助中列出有效值:

 parser = argparse.ArgumentParser(description='This is a demo.') parser.add_argument("-l", "--log", dest="logLevel", choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], help="Set the logging level") args = parser.parse_args() if args.logLevel: logging.basicConfig(level=getattr(logging, args.logLevel)) 

用法:

 demo.py --log DEBUG 

另一种方法是计算-v的数量,并将count作为list的索引,并logging实际的级别:

 import argparse import logging parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', action='count', default=0) args = parser.parse_args() levels = [logging.WARNING, logging.INFO, logging.DEBUG] level = levels[min(len(levels)-1,args.verbose)] # capped to number of levels logging.basicConfig(level=level, format="%(asctime)s %(levelname)s %(message)s") logging.debug("a debug message") logging.info("a info message") logging.warning("a warning message") 

这适用于-vvvv-vvv-vv-v-v -v等,如果没有-v那么logging.WARNING被选中,如果提供了更多的-v ,它将会进入INFODEBUG

您可以在-v标志之后明确指定一个级别为整数:

 parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbose", const=1, default=0, type=int, nargs="?", help="increase verbosity: 0 = only warnings, 1 = info, 2 = debug. No number means info. Default is no verbosity.") args = parser.parse_args() logger = logging.getLogger() if args.verbose == 0: logger.setLevel(logging.WARN) elif args.verbose == 1: logger.setLevel(logging.INFO) elif args.verbose == 2: logger.setLevel(logging.DEBUG) 

如果您想为不想(或不能)编辑的脚本启用logging.DEBUG级别,则可以自定义启动:

 jcomeau@aspire:~$ python -c "import site; site._script()" [snip]... USER_BASE: '/home/jcomeau/.local' (exists) USER_SITE: '/home/jcomeau/.local/lib/python2.7/site-packages' (exists) ENABLE_USER_SITE: True jcomeau@aspire:~$ mkdir -p ~/.local/lib/python2.7/site-packages jcomeau@aspire:~$ vi ~/.local/lib/python2.7/site-packages/usercustomize.py 

input以下内容:

 import os, logging if os.getenv('DEBUGGING'): logging.basicConfig(level = logging.DEBUG) 

那么你可以只是:

 jcomeau@aspire:~$ mkdir -p /tmp/some/random/ jcomeau@aspire:~$ echo 'import logging; logging.debug("test")' >> /tmp/some/random/script.py jcomeau@aspire:~$ DEBUGGING=1 python /tmp/some/random/script.py DEBUG:root:test 

来自Paul Ollis的http://nedbatchelder.com/blog/201001/running_code_at_python_startup.html


2017-07-18:我已经切换到不同的方法:

 logging.basicConfig(level=logging.DEBUG if __debug__ else logging.INFO) 

这是做什么的,如果你没有优化运行(如python script.py ),你会得到DEBUG级别的东西,而如果你用python -OO script.py运行,你不会。 没有环境variables设置。

这里有另一个需要argparse计数-v选项,从默认的警告到INFO(-v)到DEBUG(-vv)两个级别增加详细程度。 这不会映射到logging定义的常量,而是直接计算值,限制input:

 print( "Verbosity / loglevel:", args.v ) logging.basicConfig( level=10*(3-max(0,min(args.v,3))) ) logging.debug("debug") # 10 logging.info("info") # 20 logging.warning("warning") # 30 - The default level is WARNING, which means that only events of this level and above will be tracked logging.error("error") # 40 logging.critical("critical") # 50