更简单的方法来启用详细的日志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
(对于开发者)是有用的。 以下是我如何使用logging
和argparse
:
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
,它将会进入INFO
和DEBUG
您可以在-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