我使用 argparse 从命令行获取日志记录级别,然后将其作为logging.basicConfig的输入传递。然而,我试图实现这一点的方式不起作用。有什么建议吗?
期望的行为,来自命令行:
python main.py -log=DEBUG
期望的输出
DEBUG:__main__: Debug is working
代码
import logging
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-log", "--log", nargs='+', help="Provide logging level. Example --log debug'")
log_level = parser.parse_args().log
log_level = 'logging.'+log_level[0]
print(log_level)
logging.basicConfig(level=log_level)
logger = logging.getLogger(__name__)
logger.debug(' Debug is working')
在代码中遇到的问题是将日志记录级别作为字符串“logging.DEBUG”传递,而不是实际的日志记录级别。应该使用
logging
模块中的常量,例如
logging.DEBUG
。
以下是代码的更正版本:
import logging
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-log", "--log", help="提供日志记录级别。例如,--log DEBUG")
args = parser.parse_args()
log_level = getattr(logging, args.log.upper(), None)
if not isinstance(log_level, int):
raise ValueError('无效的日志记录级别: %s' % args.log)
logging.basicConfig(level=log_level)
logger = logging.getLogger(__name__)
logger.debug('调试正常')
说明:
-
获取日志记录级别:
-
我们使用
args.log.upper()
获取提供的日志记录级别字符串并将其转换为大写字母,以支持大小写不敏感的输入(例如,“debug”、“DEBUG”)。 -
我们使用
getattr(logging, args.log.upper(), None)
安全地从logging
模块中获取相应的日志记录级别。如果提供的日志记录级别无效,这将返回None
。
-
我们使用
-
验证日志记录级别:
-
我们检查获得的
log_level
是否是int
类型的实例。所有有效的日志记录级别(例如,logging.DEBUG
、logging.INFO
等)都是整数。如果它不是整数,则会引发ValueError
,指示无效的日志记录级别。
-
我们检查获得的
-
设置日志记录级别:
-
如果日志记录级别有效,我们使用
logging.basicConfig(level=log_level)
将根记录器的日志记录级别设置为提供的级别。
-
如果日志记录级别有效,我们使用
通过这些更改,的代码现在应该能够从命令行参数中正确解析和设置日志记录级别。
标签:python,logging,argparse From: 57192387