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

Mad*_*ist 11 python logging python-3.x

从Python 3.2开始,logging.Logger.setLevel接受字符串级别,例如'INFO'而不是相应的整数常量.这非常方便,除非您无法以数字方式比较这些级别,而大多数其他日志记录方法只接受整数.如何使用logging包提供的功能将级别字符串转换为数字级别?具体来说,我想要做到这一点:

>>> logging.???('INFO') == logging.INFO
True
Run Code Online (Sandbox Code Playgroud)

Vin*_*jip 13

如何使用类似的东西

$ 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
>>> 
Run Code Online (Sandbox Code Playgroud)


ron*_*kov 11

您还可以使用:

import logging
logging.getLevelName('INFO')
Run Code Online (Sandbox Code Playgroud)

  • Python 3.11 引入了 `getLevelNamesMapping` https://docs.python.org/3/library/logging.html#logging.getLevelNamesMapping,它是从字符串到日志级别中的级别名称的映射 https://docs.python.org/ 3/library/logging.html#logging-levels (int)。这应该澄清语义。 (4认同)
  • 我绝对不建议使用“logging.getLevelName()”。该函数的接口很混乱,你永远无法确定返回的是“str”还是“int”。即使使用“str”,您也无法判断该字符串是否代表真实级别(如“INFO”)或无效值(如“level info”)。没有值检查,没有类型检查 -> 不要使用它。 (3认同)

Mad*_*ist 8

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

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

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

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


sty*_*ane 6

.level 返回日志事件的数字级别。

演示:

>>> logger = logging.getLogger()
>>> logger.setLevel('INFO')
>>> logger.level == logging.INFO
True
Run Code Online (Sandbox Code Playgroud)

为了避免 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
Run Code Online (Sandbox Code Playgroud)

例子:

>>> from basic_args import logLevelToInt
>>> logLevelToInt('DEBUG')
10
>>> logLevelToInt('CRITICAL')
50
>>> import logging
>>> logLevelToInt(logging.INFO)
20
>>>
Run Code Online (Sandbox Code Playgroud)

  • 这非常有用,可以回答我的字面问题。但是,我希望能够在不设置日志级别的情况下获取数字。 (3认同)