如何从命令行设置日志记录级别

时间:2019-07-24 23:14:38

标签: python logging argparse

我正在使用argparse从命令行获取日志记录级别,然后将其作为logging.basicConfig的输入进行传递。但是,我试图实现此目的的方法不起作用。有什么建议吗?

期望行为,通过命令行:

python main.py -log=DEGUB

期望输出

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

4 个答案:

答案 0 :(得分:4)

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

expo start

答案 1 :(得分:1)

级别应该是logging中的变量,而不是字符串,例如logging.DEBUG。我认为您必须创建一个字典来匹配给定的参数和日志记录变量:

level_config = {'debug': logging.DEBUG, 'info': logging.INFO} # etc.
log_level = level_config[parser.parse_args().log[0].lower()]

您也可以在choices=['debug', 'info', 'warning']通话中添加add_argument

答案 2 :(得分:1)

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.' )

答案 3 :(得分:0)

log_level = 'logging.'+log_level[0]仅会使字符串'logging.DEBUG'成为basicConfig不能理解的字符串。它想要的是logging.DEBUG可以得到的getattr(logging, log_level[0])常量。较新版本的python实际上也接受文本表示,您只需将'DEBUG'作为级别传递即可。