记录getLevelName方法的实现

时间:2017-02-06 09:25:12

标签: python logging log-level

根据文档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是我从其他方法获得的字符串......

有什么建议吗?

由于

4 个答案:

答案 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。它可能会澄清您的疑虑。