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

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

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

【问题讨论】:

    标签: python python-3.x logging


    【解决方案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
      >>> 
      

      【讨论】:

      • 这正是我想要的。不修改任何记录器状态的查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      相关资源
      最近更新 更多