根据文档here和此回答here,要求记录器的logLevel应返回此级别名称之一
_levelNames = {
CRITICAL : 'CRITICAL',
ERROR : 'ERROR',
WARNING : 'WARNING',
INFO : 'INFO',
DEBUG : 'DEBUG',
NOTSET : 'NOTSET',
'CRITICAL' : CRITICAL,
'ERROR' : ERROR,
'WARN' : WARNING,
'WARNING' : WARNING,
'INFO' : INFO,
'DEBUG' : DEBUG,
'NOTSET' : NOTSET,
}
但是当我打电话时
print logging.getLevelName("debug")
我明白了:
级别调试
所以我不能以一种舒适的方式做类似的事情:
logger.setLevel(foo)
其中fo是我从其他方法获得的字符串......
有什么建议吗?
由于
答案 0 :(得分:2)
这不是文档所说的。它说如果你传递一个映射到一个预定义日志记录级别的整数,你会得到一个很好的打印字符串版本:
>>> print(logging.getLevelName(logging.DEBUG))
DEBUG
否则你会得到“等级x”,如你所说。
链接的答案明确指出从字符串到整数不是该函数的作用。
答案 1 :(得分:2)
链接的文档没有说明您声称的内容。这就是getLevelName
的文档字符串实际上说的内容:
返回日志记录级别lvl的文本表示形式。如果级别是CRITICAL,ERROR,WARNING,INFO或DEBUG的预定义级别之一,那么您将获得相应的字符串。
不是你的情况,因为“debug”不是预定义级别之一。
如果您使用addLevelName()与名称关联,则返回与lvl关联的名称。
不是你的情况,因为你没有提到使用addLevelName
。
如果传入与其中一个已定义级别对应的数值,则返回相应的字符串表示。
不是你的情况,因为你没有传递数值。
否则,返回字符串“Level%s”%lvl。
这是您的情况,因此logging.getLevelName("debug")
的预期回报值为"Level debug"
。
答案 2 :(得分:2)
先前的答案已充分讨论了此问题,但对于一般观察,我想添加一种替代方法,将日志记录级别字符串转换为内部整数值。
getattr(logging, level_string)
为什么?仅仅因为logging.getLevelName()
函数具有讨厌的功能,可以为您返回无效参数的那些“ Level X”字符串。
让我们假设您正在编写一个Flask应用程序,该应用程序允许在实例配置文件中设置日志记录级别(例如LOGGING_LEVEL = "WARNING"
)。这相当于我书中的用户输入,并且我认为您应该能够处理无效值。第三个参数,后备值使我们可以做到这一点:
app = Flask(...)
app.config.from_pyfile('application.conf')
app.logger.setLevel(
getattr(
logging,
str(app.config.get('LOG_LEVEL', 'DEBUG')),
logging.DEBUG
)
)
现在,您的代码应该能够容忍错误/丢失的配置值,并且在这种情况下默认为DEBUG日志记录模式。
如果您的日志记录级别值不是用户输入的,那么所有这些都是不必要的,也与您无关,因此,不太可能丢失或没有意义。那么,您认为logging.getLevelName()
就可以了。
我的5美分是,编写日志记录模块的人们错过了一个明显的机会,即通过向我们提供可选的第三个函数参数(回退值)来解决所有这些问题,但这就是事实。
希望这对某人有帮助。
答案 3 :(得分:1)
我会告诉你有关你怀疑的更多细节:
logging.getLevelName('DEBUG')
输出为10
logging.getLevelName(10)
输出为debug
请参阅此logging.getLevelName。它可能会澄清您的疑虑。