首页 > 解决方案 > 如何从命令行设置日志记录级别

问题描述

我正在使用 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')

标签: pythonloggingargparse

解决方案


将这些组合放在一起,允许用户使用大写或小写来命名级别,只允许指定一个级别,并从默认为警告级别的字典中选择显式级别:

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__)

推荐阅读