我正在设置一个用户界面,并希望允许用户指定所需的日志记录类型。为此,我想使用这样的东西:
logging.basicConfig(level=logging.INFO)
可以在其中指定INFO设置的地方。
对于日志记录,有以下选项:DEBUG,INFO,WARNING,ERROR,CRITICAL,我将其存储在字符串中。如何将字符串适当替换为上面的代码?
答案 0 :(得分:1)
您有一些选择。
最好是字典:
logtypes = {
"INFO": logging.INFO,
"DEBUG": logging.DEBUG,
...
}
另一个正在使用条件句:
if logtype == "INFO":
logparam = logging.INFO
elif logtype == "DEBUG":
logparam = logging.DEBUG
else:
...
确实存在另一个较短的选项,但确实冒着logtype
之类的__dir__
不会立即出错的风险:getattr(logging, logtype)
。
此外,如果您真的讨厌惯例,并且在这个世界上所有美好而神圣的事情,请执行eval("logging." + logtype)
。
答案 1 :(得分:0)
logging.LEVEL
是一个整数值,如in the manual所示。
您可以将该值存储在配置中(我想您正在使用ConfigParser或JSON或类似的东西?),只需在应用程序启动时加载它即可。关于如何将文本链接到值,这取决于UI工具包,最简单的方法可能是使用基于dict键的值的组合框。
使用配置解析器记录设置示例
# read configuration
cfg = configparser.ConfigParser()
cfg.read(config_file_path)
# set logging
...
logging.basicConfig(level=cfg['logging'].getint('level'))
...
答案 2 :(得分:0)
您可以使用字典对其进行转换
import logging
converter = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warning": logging.WARNING,
"error": logging.ERROR,
"critical": logging.CRITICAL
}
# selected_level = input('select level: ')
# selected_level = sys.argv[1]
selected_level = 'info'
if selected_level in converter:
selected_level = converter[selected_level]
else:
selected_level = logging.INFO
logging.basicConfig(level=selected_level)
答案 3 :(得分:0)
尽管名称logging.getLevelName
实际上会同时转换两种方式:
In [1]: import logging
In [2]: logging.getLevelName(logging.CRITICAL)
Out[2]: 'CRITICAL'
In [3]: logging.getLevelName('CRITICAL')
Out[3]: 50
In [4]: logging.CRITICAL
Out[4]: 50