如何将python日志记录级别名称转换为整数代码

Posted

技术标签:

【中文标题】如何将python日志记录级别名称转换为整数代码【英文标题】:How to convert python logging level name to integer code 【发布时间】:2016-06-11 06:42:49 【问题描述】:

从 Python 3.2 开始,logging.Logger.setLevel 接受字符串级别,例如“INFO”,而不是相应的整数常量。这非常方便,除了您无法以数字方式比较级别并且大多数其他日志记录方法仅接受整数。如何使用logging 包提供的函数将级别字符串转换为数字级别?具体来说,我想要这样做的东西:

>>> logging.???('INFO') == logging.INFO
True

【问题讨论】:

【参考方案1】:

.level 返回记录事件的数字级别。

演示:

>>> logger = logging.getLogger()
>>> logger.setLevel('INFO')
>>> logger.level == logging.INFO
True

为了避免 OP 在他的评论中提出的问题,您可以使用这样的临时记录器:

import logging
import uuid

logging.basicConfig()
logger = logging.getLogger(__file__)


def logLevelToInt(level):
    '''convert given level to int'''
    _id = str(uuid.uuid4())
    logger = logging.getLogger(_id)
    logger.setLevel(level)
    rval = logger.level
    logging.Logger.manager.loggerDict.pop(_id)
    return rval

示例:

>>> from basic_args import logLevelToInt
>>> logLevelToInt('DEBUG')
10
>>> logLevelToInt('CRITICAL')
50
>>> import logging
>>> logLevelToInt(logging.INFO)
20
>>>

【讨论】:

这非常有用,可以回答我的字面问题。但是,我希望能够在不设置日志级别的情况下获取数字。 @MadPhysicist,解决方案是创建一个临时记录器,设置其级别,查看 logger.level,然后删除记录器。 可能比使用那些私有方法更好。 @shrewmouse。听起来有点矫枉过正,日志 API 现已更新 @MadPhysicist 是的,你可能是对的。我只是想展示如何做到这一点。我被旧的 API 卡住了。【参考方案2】:

logging 模块中有几个属性允许此功能。它们带有下划线前缀,暗示隐私,因此使用它们不是一个好主意。然而:

在***别,有_checkLevel,它采用字符串或整数级别,并返回相应的现有级别或引发ValueError

_checkLevel 包装了字典_nameToLevel,其中包含所有已注册的级别(并由addLevelName 更新)。

还有一个名为_levelToName 的附加成员,其中包含反向映射。它可通过getLevelName 方法公开访问。

【讨论】:

【参考方案3】:

使用类似的东西怎么样

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> getattr(logging, 'INFO')
20
>>> getattr(logging, 'DEBUG')
10
>>> getattr(logging, 'ERROR')
40
>>> 

【讨论】:

这正是我想要的。不修改任何记录器状态的查询。

以上是关于如何将python日志记录级别名称转换为整数代码的主要内容,如果未能解决你的问题,请参考以下文章

如何连接因子,而不将它们转换为整数级别?

日 志 框 架

日 志 框 架

模块 logging random

模块下篇————包和模块

python的logging模块