Tes*_*001 8 python logging argparse
我正在使用 argparse 从命令行获取日志记录级别,然后将其作为 logging.basicConfig 的输入传递。但是,我试图实现这一点的方式不起作用。有什么建议吗?
期望行为,来自命令行:
python main.py -log=DEBUG
Run Code Online (Sandbox Code Playgroud)
欲望输出
DEBUG:__main__: Debug is working
Run Code Online (Sandbox Code Playgroud)
代码
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')
Run Code Online (Sandbox Code Playgroud)
Gla*_*zed 25
该basicConfig函数可以接受一个字符串参数level,并且它会为您检查其有效性,因此代码可以比 BarryPye 的答案简单得多。
import argparse
import logging
parser = argparse.ArgumentParser()
parser.add_argument( '-log',
'--loglevel',
default='warning',
help='Provide logging level. Example --loglevel debug, default=warning' )
args = parser.parse_args()
logging.basicConfig( level=args.loglevel.upper() )
logging.info( 'Logging now setup.' )
Run Code Online (Sandbox Code Playgroud)
将这些组合放在一起,允许用户用大写或小写命名级别,只允许指定一个级别,并从字典中选择显式级别,默认为警告级别:
import argparse
import logging
parser = argparse.ArgumentParser()
parser.add_argument(
"-log",
"--log",
default="warning",
help=(
"Provide logging level. "
"Example --log debug', default='warning'"),
),
)
options = parser.parse_args()
levels = {
'critical': logging.CRITICAL,
'error': logging.ERROR,
'warn': logging.WARNING,
'warning': logging.WARNING,
'info': logging.INFO,
'debug': logging.DEBUG
}
level = levels.get(options.log.lower())
if level is None:
raise ValueError(
f"log level given: {options.log}"
f" -- must be one of: {' | '.join(levels.keys())}")
logging.basicConfig(level=level)
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
例如,级别应该是变量而logging不是字符串。logging.DEBUG我认为你必须创建一个与给定参数和日志变量匹配的字典:
level_config = {'debug': logging.DEBUG, 'info': logging.INFO} # etc.
log_level = level_config[parser.parse_args().log[0].lower()]
Run Code Online (Sandbox Code Playgroud)
您也可以添加choices=['debug', 'info', 'warning']到您的add_argument通话中。