【问题标题】:Python logging - determine level number from namePython日志记录-根据名称确定级别编号
【发布时间】:2013-08-23 00:21:39
【问题描述】:

可以使用logging.addLevelName 注册 Python 日志记录级别。有没有一种方法可以从级别名称中获取 Python 日志记录编号?

【问题讨论】:

  • 只是为了确保:您确实注意到the documentation on this function 说“定义您自己的级别是可能的,但不是必须的,因为现有级别是根据实际经验选择的。但是,如果您确信需要自定义关卡,则在执行此操作时应格外小心……"

标签: python


【解决方案1】:

在您调用addLevelName 后,生成的级别将被视为与所有标准级别完全相同:

>>> import logging
>>> logging.getLevelName(10)
'DEBUG'
>>> logging.getLevelName('DEBUG')
10
>>> logging.addLevelName(15, 'DEBUGGISH')
>>> logging.getLevelName(15)
'DEBUGGISH'
>>> logging.getLevelName('DEBUGGISH')
15

getLevelName 可以将名称映射到数字以及将数字映射到名称这一事实实际上并没有在 Python 2.x 中记录,该名称也没有给出任何暗示它应该......但快速浏览the source 显示为什么有效。

【讨论】:

  • 看起来记录在我看来。 "如果传入一个定义的级别对应的数值,则返回对应的字符串表示形式。"
  • @user2357112:相反,没有记录,您传入一个字符串并返回相应的数字。
  • 如果日志模块正式导出一个名称表就好了。 [k for k in logging._levelNames if isinstance(k, basestring)] 有效,但是,呜呜。 :-)
  • @torek:我认为如果它为数字名称和数字名称保留单独的字典,并且在 getLevelName(number) 函数旁边有一个 getLevelNumber(name) 函数,它会更干净。 IIRC,在 pre-stdlib 模块中激发这种单字典设计的聪明技巧甚至不再存在。
  • @torek:另外,请注意the module itself 比你的更糟糕,检查str(level) == level 以验证它是一个字符串。
【解决方案2】:

如果您可以处理默认级别,则检查结果的类型是一个不错的解决方法。

int_level = logging.getLevelName(string_level)
  if type(int_level) != int:
    int_level = 20 # default to INFO

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多